【发布时间】: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