3

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

我有 2 张桌子:

  • 一个“user_details”表
  • 一个“skills”表,其中包含 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 是可能的。

编辑:与分组,计数,拥有等有关。您可以通过命令限制分组,并要求您返回多少匹配的行?(例如本例中的 5)。

编辑2:测试:

HAVING COUNT( * ) > 5
4

3 回答 3

2

您不需要子查询或联接。

SELECT user_id
FROM skills
WHERE skill_id IN (51, 52, 53, 54, 55)
GROUP BY user_id
HAVING COUNT(*) = 5;
于 2008-12-12T00:33:46.140 回答
1

只需添加更多单连接。

INNER JOIN 技能 s ON u.id - us.userid AND Skill_id = $s1
INNER JOIN 技能 s ON u.id - us.userid AND Skill_id = $s2
INNER JOIN 技能 s ON u.id - us.userid AND Skill_id = $ s3
INNER JOIN 技能 s ON u.id - us.userid AND Skill_id = $s4
等。

它将被要求加入他们所有人。您不需要任何组或计数。

于 2008-12-12T00:27:41.503 回答
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
于 2008-12-12T01:46:07.710 回答