您好我有一个问题给了我一些问题,建议我问一个关于最终结果而不是问题的单独问题。
所以我有三个表和一些用户输入。
表格是:
每个表都有一个相关的ID,用户表有ID,另外两个用户ID,用来匹配用户的技能和语言
用户输入是动态的,但例如对于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
答案 0 :(得分: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的做事方式。
答案 1 :(得分:1)
类似
SELECT * from users left join usersLanguage on users.id=usersLanguage.userID
left join usersSkills on usersSkills.userID=users.id
where usersLanguage.id in (1, 2, 3) and usersSkills.id in (1, 2, 3)
GROUP BY users.id
可能会起作用
答案 2 :(得分:1)
试试这个
SELECT users.ID,user.name
FROM users
INNER JOIN usersSkills ON users.ID = usersSkills.userId
INNER JOIN AND usersLanguages ON users.ID = usersLanguages.userID
WHERE activate = '1'
AND type = 'GRADUATE'
AND usersSkill.skillID IN (2)
AND usersLanguages.languageID IN (2)
GROUP BY users.ID