假設我有一個用戶和偏好表,以及user_preference兩者之間的橋接表:
/* user table: */
---------- --------------
| Field | Type |
---------- --------------
| id | int |
| username | varchar(255) |
---------- --------------
/* preference table: */
------------ --------------
| Field | Type |
------------ --------------
| preference | varchar(255) |
------------ --------------
/* user_preference table: */
----------------- --------------
| Field | Type |
----------------- --------------
| user_id | int |
| preference_name | varchar(255) |
----------------- --------------
例如,有 3 個偏好可供選擇:“游泳”、“看電視”、“騎自行車”。一個用戶可以擁有零個或全部 3 個偏好,這反映在user_preference表格上。
現在我想查詢 10 個不同的用戶,并且每個用戶都包含他們自己的偏好,無論是 null 還是多個偏好,如何為此構造一個 select 陳述句?
到目前為止,我已經嘗試過這樣的事情:
SELECT u.*, p.preference_name
FROM user u
LEFT JOIN user_preference p ON p.user_id = u.id
LIMIT 10;
/* Result: */
id | username | preference_name
1 | user1 | swimming
1 | user1 | cycling
2 | user2 | null
3 | user3 | watching TV
... /* rest of the result */
如您所見,結果將回傳一個 duplicate user1,并且不會是 10 個不同的用戶。我知道distinctandgroup by關鍵字,它不能解決問題,因為它只會為用戶回傳一個偏好,而用戶可以有多個偏好。
如何用一個單一的選擇陳述句做到這一點?
uj5u.com熱心網友回復:
嘗試這個。
SELECT u.*,
GROUP_CONCAT(DISTINCT p.preference_name) AS prefs
FROM user u
LEFT JOIN user_preference p ON p.user_id = u.id
GROUP BY u.id
LIMIT 10;
GROUP_CONCAT() 將為每個用戶創建一個以逗號分隔的首選項串列。
親提示。當表變得非常大時,更改 ENUM 以添加更多值會非常耗時。另外,設計資料庫通常是不明智的,因此隨著資料庫的增長,它需要大量的 ALTER TABLE 陳述句。因此,如果您希望您的可能偏好是開放式的,那么您概述的方法是正確的方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/484585.html
下一篇:使用兩個現有列計算第三列的值
