2011-09-26 104 views
0

嗨我有一个查询给我几个问题,并建议我问一个关于最终结果而不是问题的单独问题。在多个表中匹配结果MYSQL

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

的表格是:

  • 用户,
  • usersLanguages和
  • usersSkills

每个表具有相关的ID的用户表中有ID和它们具有用户ID的另外两个将技能和语言与用户进行匹配

用户输入是动态的,但例如它可以为用户语言和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

有关证明查询什么? – genesis

+0

@genesisφ这就是我走到这一步,感谢一些帮助,但它并没有因为有COUNT(*)= 1个 –

回答

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的做事方式。

+0

感谢的工作,但我想与这个问题是它将如果是任何一个用户相匹配这些ID我需要匹配所有这些,这就是为什么我有在那里计数 –

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 

可能会工作

+0

像我上面提到的我需要它匹配IN()中的每个ID这就是为什么我有COUNT(*)结果匹配 –

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