有一个问题似乎很容易在纸上,但我有一个很大的问题,弄清楚如何最好地编写单个查询。
我有一张桌子
CREATE TABLE `profile_values` ( `fid` int(10) unsigned NOT NULL default '0', `uid` int(10) unsigned NOT NULL default '0', `value` text, PRIMARY KEY (`uid`,`fid`), KEY `fid` (`fid`) )
此表的重点是将个人资料信息存储在用户身上 例如。典型的行看起来像这样..
fid | uid | value __________________ 1 | 77 | Mary 11 | 77 | Poppins 1 | 123 | Steve 11 | 123 | Davis
注意:
'fid' of '1' represents the first name 'fid' of '11' represents the last name 'uid' is a users id within the site.
我想要实现的是将所有满足名字条件的uid(如'S%')和姓氏(如'D%')带回来。
我需要这个的原因是因为我在网站上为用户提供了一个自动完成搜索框
因此,如果我在搜索框中键入“S”,我将看到以字母'S'开头的所有用户的列表,如果我现在键入一个空格并且'D'我现在应该能够看到匹配的用户列表这两个条件。
有谁知道如何实现这一目标? 提前致谢。
答案 0 :(得分:4)
select firstname.uid, fistname.value, lastname.value
from
profile_values firstname
inner join profile_values lastname
on firstname.uid = lastname.uid
WHERE
firstname.fid = 1
AND lastname.fid = 11
AND fistname.value like 'S%'
AND lastname.value like 'D%'
或者,使用用户表
select users.uid, fistname.value, lastname.value
from
users
inner join profile_values firstname
on firstname.uid = users.uid
AND firstname.fid = 1
inner join profile_values lastname
on lastname.uid = users.uid
AND lastname.fid = 11
WHERE
fistname.value like 'S%'
AND lastname.value like 'D%'
编辑:
忘记提及:union对许多dbms执行不好。如果您需要联合,那么您的数据库模型通常会出现问题。在使用union之前使用任何其他替代方法。
答案 1 :(得分:4)
您展示的表格似乎是inner-platform effect反模式的典型示例。
因此,我不会在短期内(已经完成)回答您的问题,我会回答说,从长远来看,您的目标应该是更改数据库,以便将名字和姓氏存储在他们的自己的专栏。然后可以将这些索引编入索引,以便这种类型的搜索速度更快,并且它们将更容易使用,因为您可以直接使用列名称。
使用数字来表示存储在列中的数据类型这一事实表明实际使用的数据类型有限,这意味着它们可以分解为单独的列(如果空间是关注和许多值为null然后您可以使用稀疏列。)
然后你的查询就像是:
select * from users where first_name like 's%' and last_name like 'd%'
答案 2 :(得分:2)
SELECT *
FROM profile_values pv1
WHERE pv1.fid = 1
AND pv1.value LIKE 'M%'
JOIN profile_values pv11
ON pv11.fid = 11
AND pv11.value LIKE 'D%'
AND pv11.uid = pv1.id
答案 3 :(得分:2)
加入profile_values 两次,如下所示:
SELECT p1.uid
FROM profile_values p1, profile_values p2
WHERE p1.uid=p2.uid AND p1.fid=1 AND p2.fid=11
AND p1.value LIKE 'S%'
AND p2.value LIKE 'D%'