嗨,我有一个查询给我一些问题,有人建议我再问一个关于最终结果的问题,而不是问题。

所以我有三个表和一些用户输入。

这些表是:


用户,
用户语言和
用户技能


每个表都有一个相关的ID,users表具有ID,另外两个表具有userID以将技能和语言与用户匹配

用户输入是动态的,但例如对于用户而言可以为1,对于用户而言可以为2

用户输入来自表单,我需要做的就是匹配以获取用户结果
取决于所传递的语言ID或技能ID。例如,我可以传递两个用户ID和三个语言ID。

SELECT DISTINCT users.ID, users.name
FROM users
INNER JOIN usersSkills
ON users.ID = usersSkills.userID
INNER JOIN usersLanguages ON users.ID = usersLanguages.userID
WHERE activated = "1"
      AND type = "GRADUATE" AND usersSkills.skillID IN(2)
      AND usersLanguages.languageID IN(2)
GROUP BY usersSkills.userID HAVING COUNT(*) = 1,
         usersLanguages.userID HAVING COUNT(*) = 1

最佳答案

您不能混用group byhaving子句。
具有不是分组依据的一部分,实际上您可以在没有分组依据的情况下使用having,在这种情况下,它将作为功能更强大(且更慢)的where子句起作用。

SELECT u.ID, u.name
FROM users u
INNER JOIN usersSkills us ON u.ID = us.userID
INNER JOIN al ON u.ID = ul.userID
WHERE u.activated = '1'
      AND u.type LIKE 'GRADUATE' AND us.skillID IN('2')
      AND ul.languageID IN('2')
GROUP BY u.ID
HAVING COUNT(*) = 1



由于ul.userID = us.userID = u.ID的加入条件,因此将两者分组是没有意义的。只需按u.id分组,因为这毕竟是您选择的ID。
u.name在功能上取决于ID,因此不需要列出(*)。
在进行u.type = 'GRADUATE'之类的测试时,我更喜欢执行u.type LIKE 'GRADUATE',因为LIKE不区分大小写,并且=可能不取决于排序规则,但这仅是我自己。
不需要Distinctgroup by已经使结果不同。


Having可以处理直到甚至包括group by的结果集,因此在这种情况下,您只需要一个具有having子句。如果想要更多,则需要将它们与where子句相同:

having count(*) = 1 AND SUM(money) > 10000


(*)仅在MySQL中是正确的,在其他SQL中,您需要列出group by子句中所有未聚合的选定列。它们是否在功能上取决于按列分组。这会减慢速度,并导致很长的查询语法,但确实可以防止一些初学者错误。
我个人喜欢MySQL的做事方式。

关于mysql - 在多个表中匹配结果MYSQL,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7559805/

10-12 18:04
查看更多