2012-03-01 75 views
1

的正确方式,我有如下所示MySQL的选择

id field_id  field_value   user_id 
1  4   'london'    12 
2  4   'manchester'   33 
3  25   'accounting'   12 
4  25   'web designer'  37 
5  27   'food'    12 
6  27   'wine'    34 

我的问题,现在的表是我需要查询它在人力方面的跟进,

我需要以某种方式对拆表选择查询,所以我可以寻找像这样,

我需要搜索的所有用户,其中有(“伦敦”)AND(“会计”或“网页设计)AND(食物或酒)

我的问题是我不能将field_value拆分为独立的“位置”,“职位”,“兴趣”,如果他们在不同的领域我会发现很容易做到,但是因为他们在同一个领域,我发现很难使用AND和OR组合,

如果问题很难理解,我会尝试进一步解释。 多日Thnx

此外,如果有PHPmysql的解决方案:)

+0

您是否使用EAV模式,你想要查询自定义字段?据我所知,你需要有一个用户表和用户自定义字段的表,对吗?我不太了解你的数据结构 – Oleg 2012-03-01 10:33:14

+0

你正在寻找的类别(“位置“,”职位“)由”field_id“表示,对吗?如果是这样,你可以使用子查询,只选择这些类别并从那里继续。 – TPete 2012-03-01 10:33:54

+0

@tpete well,location is lon唐曼彻斯特,职称网页设计师会计,我不能做出不同的表格,因为这是一个开源项目,并会创造更多的问题,解决他们这个小问题:) – Val 2012-03-01 10:36:34

回答

2

您所面临的问题,因为你的表是使用EAV (Entity–attribute–value model)(反)模式设计的组合,我不会介意。

一个更好的表格设计应该是有一个表'位置',一个表'职位'和一个表'兴趣'。它也可以解决你的问题。

但是,你可以使用这种设计,但它更麻烦。

我需要搜索的所有用户,其中有( “伦敦”)AND( “会计” 或“网页设计)AND(食物或酒)

SELECT y1.* 
FROM yourtable y1 
JOIN yourtable y2 
ON y1.USER_ID = y2.USER_ID 
JOIN yourtable y3 
ON y2.USER_ID = y3.USER_ID 
WHERE y1.field_id = 4 
AND y1.field_value = "london" 
AND y2.field_id = 25 
AND y2.field_value IN ("accounting", "web design") 
AND y3.field_id = 27 
AND y3.field_value IN ("food", "wine") 
+0

你忘了'as'关键字? '... as y1'?或者是可选的? – Val 2012-03-01 10:34:35

+2

这是可选的,但如果您认为它更清楚,随时添加它。 – Konerak 2012-03-01 10:35:07

+1

你应该加入'user_id',否则,查询不会返回任何东西 – newtover 2012-03-01 10:42:19

1
SELECT * 
    FROM table 
    WHERE user_id IN(SELECT user_id FROM table WHERE field_value LIKE '%london%') 
    AND user_id IN (SELECT user_id FROM table WHERE field_value LIKE '%accounting%' OR field_value LIKE '%web design%') 
    AND user_id IN (SELECT user_id FROM table WHERE field_value LIKE '%food%' OR field_value LIKE '%wine%')