2011-09-26 153 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