【问题标题】:Get list of values into one column through foreign key通过外键将值列表获取到一列中
【发布时间】:2018-12-19 02:47:47
【问题描述】:

我有两个表“样本”和“流程”,我想在一列中获取给定样本的所有流程。

表格“样本”示例:

----------------------------------------
|           Sample Table               |
|                                      |
|id  | timestamp  | other columns...   |
 --------------------------------------
|1   | 24/04/1994 | ...                |
|2   | 25/04/1994 | ...                |
|... |...         | ....               |  
----------------------------------------

表“进程”示例:

----------------------------------------
|          Processes Table             |
|                                      |
|id  | sample_id  | process_name       |
 --------------------------------------
|1   | 1          | facebook           |
|2   | 1          | tinder             |
|3   | 1          | clash royale       |
|4   | 2          | uno                |
|5   | 2          | whatsapp           |
|... |...         | ....               |  
----------------------------------------

结果:

------------------------------------------------------------
|          Result Table                                     |
|                                                           |
|sample_id  | timestamp  | processes                        |
 -----------------------------------------------------------
|1          | 24/04/1994 | [facebook, tinder, clash royale] |
|2          | 25/04/1994 | [uno, whatsapp]                  |
------------------------------------------------------------

是否可以通过 SQL 查询来做到这一点?怎么样?

PS:我知道我可以通过以下方式获得给定样本的所有过程:

SELECT sample_id, timestamp, process_name
FROM sample, processes
WHERE sample.id = processes.sample_id

但这给了我太多不必要的行

【问题讨论】:

    标签: mysql sql group-concat


    【解决方案1】:

    您可以尝试将GROUP_CONCATCONCAT 函数一起使用。

    架构 (MySQL v5.7)

    CREATE TABLE sample(
       id INT,
       timestamp DATE
    
    );
    
    
    
    
    INSERT INTO sample VALUES (1,'1994/04/24'); 
    INSERT INTO sample VALUES (2,'1994/04/25'); 
    
    CREATE TABLE processes(
       id INT,
       sample_id INT,
      process_name VARCHAR(50)
    
    );
    
    
    INSERT INTO processes VALUES (1   ,1,'facebook');
    INSERT INTO processes VALUES (2   ,1,'tinder');
    INSERT INTO processes VALUES (3   ,1,'clash');
    INSERT INTO processes VALUES (4   ,2,'uno');
    INSERT INTO processes VALUES (5   ,2,'whatsapp');
    

    查询 #1

    SELECT sample_id, timestamp, CONCAT('[',GROUP_CONCAT(process_name),']') processes
    FROM sample JOIN processes ON sample.id = processes.sample_id
    GROUP BY sample_id, timestamp;
    
    | sample_id | timestamp  | processes               |
    | --------- | ---------- | ----------------------- |
    | 1         | 1994-04-24 | [tinder,clash,facebook] |
    | 2         | 1994-04-25 | [uno,whatsapp]          |
    

    View on DB Fiddle

    注意

    我会使用JOIN 而不是使用,,因为JOIN 强调连接两个表的关系。

    【讨论】:

    • separator ',' 是多余的,因为它是 GROUP_CONCAT 的默认值。
    • 很好,这正是我需要的:)
    猜你喜欢
    • 2020-08-06
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-10
    相关资源
    最近更新 更多