您好,我有一个查询给我带来了一些问题,建议我就最终结果而不是问题提出一个单独的问题。
所以我有三个表和一些用户输入。
表格是:
- 用户,
- 用户语言和
- 用户技能
每个表都有一个相关的 ID,用户表有 ID,另外两个表有 userID,用于将技能和语言与用户相匹配
用户输入是动态的,但例如,usersLanguages 可以为 1,usersSkills 可以为 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 不是 group by 的一部分,事实上,您可以在没有 group by 的情况下使用 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/