嗨,我有一个查询给我一些问题,有人建议我再问一个关于最终结果的问题,而不是问题。
所以我有三个表和一些用户输入。
这些表是:
用户,
用户语言和
用户技能
每个表都有一个相关的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 by
和having
子句。
具有不是分组依据的一部分,实际上您可以在没有分组依据的情况下使用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
不区分大小写,并且=
可能不取决于排序规则,但这仅是我自己。不需要
Distinct
; group 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/