[英]Alternative to GROUP_CONCAT? Multiple joins to same table, different columns
我什至在這里不確定正確的術語。 MySQL新手,或多或少。
給定幾個表,定義如下:
CREATE TABLE users
( user_id int(11) NOT NULL auto_increment
, name VARCHAR(255)
, pri_location_id mediumint(8)
, sec_location_id mediumint(8)
, PRIMARY KEY (user_id)
);
CREATE TABLE locations
( location_id mediumint(8) NOT NULL AUTO_INCREMENT
, name varchar(255)
, PRIMARY KEY (location_id)
)
我正在嘗試進行查詢以一次性獲取用戶名以及主要和次要位置。
我可以得到這樣的一個:
SELECT u.name AS user_name, l.name as primary_location FROM users u, locations l WHERE u.primary_location_id=l.location_id
但是我在正確的語法上繪制了一個空白,用來在一個查詢中同時獲取兩者。
SELECT u.name AS user_name, l1.name as primary_location , l2.name as secondary_location
FROM users u
JOIN locations l1 ON(u.pri_location_id=l1.location_id)
JOIN locations l2 ON(u.sec_location_id = l2.location_id);
首先,如果可以的話,我會強烈考慮更改您的數據庫架構,以添加一個users_locations
表,該表可用於正確描述這種多對多關系。
該表如下所示:
user_id location_id location_type
1 1 primary
1 2 secondary
2 1 secondary
2 2 primary
等等。
您可能希望在所有三列中使用復合主鍵。 而location_type最好是枚舉數據類型。
您的查詢將像
SELECT
u.name AS user_name
l.name AS location_name
ul.location_type AS location_type
FROM users AS u
INNER JOIN user_location AS ul /* possibly use left join here if user can exist without a location */
ON u.user_id = ul.user_id
INNER JOIN locations AS l
ON ul.location_id = l.location_id
ORDER BY ul.location_type ASC
每個用戶最多返回兩個記錄(主要和次要的記錄分開,主要記錄在前)
如果您需要將此折疊成一條記錄,則可以執行以下操作:
SELECT
u.name AS user_name
COALESCE(CASE WHEN ul.location_type = 'primary' THEN l.name ELSE NULL END CASE) AS primary_location,
COALESCE(CASE WHEN ul.location_type = 'secondary' THEN l.name ELSE NULL END CASE) AS secondary_location
FROM users AS u
INNER JOIN user_location AS ul /* possibly use left join here if user can exist without a location */
ON u.user_id = ul.user_id
INNER JOIN locations AS l
ON ul.location_id = l.location_id
GROUP BY `user_name`
但是,如果您陷於當前架構,那么@Jlil的解決方案應該為您工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.