sql查询问题。我应该使用工会吗?

时间:2009-04-23 11:32:29

标签: sql mysql

有一个问题似乎很容易在纸上,但我有一个很大的问题,弄清楚如何最好地编写单个查询。

我有一张桌子

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'我现在应该能够看到匹配的用户列表这两个条件。

有谁知道如何实现这一目标? 提前致谢。

4 个答案:

答案 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%'