【问题标题】:Select rows from one table, using values from another table when present从一个表中选择行,当存在时使用另一个表中的值
【发布时间】:2020-07-16 01:34:52
【问题描述】:

我有一个像这样的“参数”表:

id | job_id | value
1  | 100    | value1
2  | 100    | value2
3  | 100    | value3
4  | 200    | value4
5  | 200    |  
6  | 200    | value7

然后,对于具有列表值的参数,我还有第二个 list_param_items 表:

id | param_id | value
1  | 5        | value5
2  | 5        | value6

我正在尝试找出一个查询,该查询允许我获取 id、job_id 和 value 列,其中包含参数表中的数据,除非参数表中的行在 list_param_items 表中具有其 id 的行, 将它们连接起来形成它的值列。

所以如果我要选择所有参数,我想得到这个:

id | job_id | value
1  | 100    | value1
2  | 100    | value2
3  | 100    | value3
4  | 200    | value4
5  | 200    | value5,value6
6  | 200    | value7

我还需要能够为给定的作业 ID 选择所有参数并获得相同的数据,仅针对该作业。所以,对于 job_id = 200:

id | job_id | value
4  | 200    | value4
5  | 200    | value5,value6
6  | 200    | value7

我已经用这个查询完成了:

SELECT * FROM (
SELECT parameters.id, parameters.job_id, GROUP_CONCAT(list_param_items.value) AS value
FROM jobdetail_input
INNER JOIN list_param_items 
ON list_param_items.param_id = parameters.id
WHERE parameters.job_id = 200
UNION
SELECT parameters.* FROM parameters 
WHERE parameters.job_id = 200
) unmerged
GROUP BY id;

问题在于,实际上,参数表中的列比我在此处显示的要多得多。所以我更喜欢一种不必列出所有列名的方法。我必须将它们全部列出的原因是从第一个 SELECT 语句中的参数中删除“值”列,以便 UNION 的两侧可以使用相同的列集。我不想将它们列出来,这样查询就不必在添加列时更新。

我的另一个问题是该查询的效率如何。即使我必须列出所有参数表列,还有更好的方法吗?

【问题讨论】:

    标签: mysql join database-design union


    【解决方案1】:

    将第一个表加入到第二个表的子查询中,将值聚合成一个 CSV 字符串:

    SELECT
        p.id,
        p.job_id,
        COALESCE(p.value, lpi.value) AS value
    FROM parameters p
    LEFT JOIN
    (
        SELECT param_id, GROUP_CONCAT(value ORDER BY value) value
        FROM list_param_items
        GROUP BY param_id
    ) lpi
        ON p.id = lpi.param_id
    ORDER BY
        p.id;
    

    Demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-19
      • 1970-01-01
      • 2012-03-04
      • 1970-01-01
      相关资源
      最近更新 更多