2010-03-01 102 views
3

此查詢正常工作,但我無法找出爲什麼它不返回任何內容,如果用戶在表「user_categories」中沒有任何類別?這是表結構:爲什麼這個查詢什麼都不返回?

用戶:用戶ID,用戶名,用戶城市

類別:分類標識,分類名稱

user_categories:用戶ID,類別ID

SELECT users.*, GROUP_CONCAT(categories.category_name) AS categories 
FROM users 
INNER JOIN user_categories ON users.user_id = user_categories.user_id 
INNER JOIN categories ON user_categories.category_id = categories.category_id 
WHERE users.user_city = 'brooklyn' 
GROUP BY users.user_id 
LIMIT 10 

我只是如果在user_categories中沒有用於user_id的行,則需要將新列「類別」設爲空...

謝謝!

回答

7

您正在使用錯誤的類型如果在兩個表中都找到匹配,則join - inner join將會成功。相反,你想嘗試一個外連接。嘗試是這樣的:

SELECT users.*, GROUP_CONCAT(categories.category_name) AS categories 
FROM users 
LEFT OUTER JOIN user_categories ON users.user_id = user_categories.user_id 
LEFT OUTER JOIN categories ON user_categories.category_id = categories.category_id 
WHERE users.user_city = 'brooklyn' 
GROUP BY users.user_id 
LIMIT 10 

Wikipedia SQL JOIN文章中可用的連接類型的一個相當不錯的總結。

+1

第二次加入也應該是左側。 – a1ex07 2010-03-01 17:35:18

+0

謝謝 - 現在修復了。 – 2010-03-01 17:36:42

3
SELECT users.*, GROUP_CONCAT(categories.category_name) AS categories 
FROM users 
LEFT JOIN 
     user_categories ON users.user_id = user_categories.user_id 
LEFT JOIN 
     categories ON user_categories.category_id = categories.category_id 
WHERE users.user_city = 'brooklyn' 
GROUP BY 
     users.user_id 
LIMIT 10 

注意,在MyISAM表,子查詢的解決方案可能會是更有效的:

SELECT users.*, 
     (
     SELECT GROUP_CONCAT(category_name) 
     FROM user_categories uc 
     JOIN categories c 
     ON  c.category_id = uc.category_id 
     WHERE uc.user_id = users.id 
     ) AS categories 
FROM users 
WHERE users.user_city = 'brooklyn' 
ORDER BY 
     user_id 
LIMIT 10 

請參閱本文中我的博客更多的細節:

2

如果兩個表中都沒有記錄,則內連接將不會返回記錄。你可能想要一個左外連接。

2

這是因爲您使用了user_categories的INNER JOIN。如果使用LEFT JOIN,那麼如果用戶沒有對應的ID,則將爲該表返回空數據。

相關問題