簡體   English   中英

可以替代GROUP_CONCAT嗎? 多個聯接到同一個表,不同的列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM