mysql:连接表+用AND样式查询查找记录,而不是OR

时间:2008-12-11 23:58:28

标签: mysql sql sql-match-all

注意:使用MySQL 4.0,这意味着没有子查询(目前)。

我有两张桌子:

  • “user_details”表格
  • 一个“技能”表,其中包含user_id和“skill_id”,映射到其他地方定义的一组预定义技能。

当前查询允许管理员通过选择技能来搜索用户,并且查询以OR方式工作,例如:

LEFT JOIN skills 
ON (ud.user_id = skills.user_id)  
WHERE skills.skill_id in (51, 52, 53, 54, 55)
GROUP BY ud.user_id

这会返回太多记录,因此我希望此搜索字段以AND方式工作,其中用户必须具有在搜索中返回的所有选定技能。

如果子查询是最佳选择,则可以升级MySQL。

编辑:与group by,count,having等有关。你能否按命令限制一组,并要求你返回多少匹配的行? (例如本例中为5)。

edit2:测试出来:

HAVING COUNT( * ) > 5

3 个答案:

答案 0 :(得分:2)

您不需要子查询或联接。

SELECT user_id
FROM skills
WHERE skill_id IN (51, 52, 53, 54, 55)
GROUP BY user_id
HAVING COUNT(*) = 5;

答案 1 :(得分:1)

只需添加更多单连接。

INNER JOIN技能ON u.id - us.userid AND skill_id = $ s1
INNER JOIN技能ON u.id - us.userid AND skill_id = $ s2
INNER JOIN技能ON u.id - us.userid AND skill_id = $ s3
INNER JOIN技能ON u.id - us.userid AND skill_id = $ s4

将需要加入所有人。您不需要任何团体或计数。

答案 2 :(得分:0)

如果您希望同一查询中包含用户详细信息,则只需执行以下操作:

SELECT * FROM user_details  
JOIN skills USING (user_id) 
WHERE skill_id IN (51, 52, 53, 54, 55) 
GROUP BY user_id 
HAVING COUNT(*) = 5