2010-02-25 66 views
2

所以,我明白這些關係是如何在mysql中工作的,但我很難弄清楚它是如何在我的代碼中實現的。PHP/MySQL - *對多關係

例如,假設我有3張桌子。

表1:用戶 - 用戶ID,用戶名,用戶城市

表2:類 - 類ID,類別名稱

表3:user_categories - 用戶ID,類別ID

如果我要爲位於特定城市的每個用戶查詢數據庫,並列出它們屬於的所有類別......我該怎麼做?我是否需要遍歷結果併爲每個用戶執行單獨的查詢,然後列出結果?或者,是否有一些神奇的查詢會返回多維數組?

我相信上面會多到很多,糾正我,如果我錯了....

編輯在user_categories表中,用戶可以包含超過1類,我m試圖找出如何返回所有人

謝謝!

回答

0

您需要JOIN表格。

如果我要查詢每個用戶的數據庫,這是在一個特定的城市,並一一列舉出來與所有他們屬於

SELECT * 
FROM users 
INNER JOIN user_categories 
    ON (user_id) 
INNER JOIN categories 
    ON (category_id) 
WHERE ... 
+0

但是,這將返回,用戶所屬的所有類別呢? – user281482 2010-02-25 18:48:57

0

類別您可以嘗試:

SELECT u.user_id, u.username, u.user_city, c.category_id, c.category_name 
FROM users u 
INNER JOIN user_categories uc ON u.user_id = uc.user_id 
INNER JOIN categories c ON uc.category_id = c.category_id 
WHERE u.user_city = 'Cityname'; 

我還沒有測試過,可能有更有效的方法來做,但它應該工作。

如果您不熟悉mysql中的連接,請檢查this

+0

我熟悉連接...但我的問題是,如果用戶有多個類別,這將加入什麼?只是它發現的第一個? – user281482 2010-02-25 18:48:05

+0

這應該爲與該用戶關聯的每個類別返回一行。 – 2010-02-25 18:50:50

2

你是絕對正確的,它是一個多對多的查詢。 從我的理解,你正在尋找的是具有某種分層結果顯示的能力,這意味着對於一個用戶來說,他有一個所有類別的分配給他...

夫婦事情可以做: 選項1:查詢用戶表:

SELECT u.user_id, u.username, u.user_city WHERE city = 'somecity'; 

從結果來看,得到所有匹配的USER_ID的,把它們放在一個陣列。

array(1,3,4,5) 

然後通過加入2個表類別和user_categories,以及使所述陣列作爲逗號在一個其中在分隔的列表執行的查詢:

SELECT user_categories.user_id, categories.category_name 
FROM user_categories INNER JOIN categories ON user_categories.category_id = categories.category_id 
WHERE user_categories.user_id IN (1,3,4,5) 

這會給你用戶的列表ID,類別名稱,您可以在您的腳本中使用以前的結果來構建結果集

選項2:我的首選,使用MySQL的GROUP_CONCAT(http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat)。

SELECT users.user_id, users.user_name, GROUP_CONCAT(categories.category_name) AS categories 
FROM users 
INNER JOIN user_categories ON users.id = users_categories.user_id 
INNER JOIN categories ON user_categories.category_id = category.id 
WHERE user.user_city = 'somecity' 
GROUP BY user.user_id 

這將返回類似:

user_id  username  categories 
1    u1   cat1, cat2, cat3 
2    u2   cat1, cat3 

您可以通過在GROUP_CONCAT,使用隔板指定的分隔符。

+0

謝謝!選項2看起來不錯...我會試試看! – user281482 2010-02-25 19:00:07