匹配结果多个表MYSQL

时间:2011-09-26 18:50:26

标签: mysql select join

您好我有一个问题给了我一些问题,建议我问一个关于最终结果而不是问题的单独问题。

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

表格是:

  • 用户,
  • usersLanguages和
  • usersSkills

每个表都有一个相关的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 

3 个答案:

答案 0 :(得分: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不区分大小写,=可能不依赖于整理,但那只是我。
  • 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