[英]Joining multiple columns into one with union, exclude results with same id
我想将多个表中的列连接到一列,在我的例子中,列“battery_value”和“technical_value”到列“value”中。 我只想获取给定 category_ids 的数据,但由于 UNION,我也从其他表中获取数据。
我有 4 张桌子: 桌子:汽车
car_id model_name
1 e6
表:电池
battery_category_id car_id battery_value
1 1 125 kW
表:技术数据
technical_category_id car_id technical_value
1 1 5
3 1 2008
表:类别
category_id category_name category_type
1 engine power battery
1 seats technical
3 release year technical
通过搜索,人们建议我使用 union 来加入这些列。 我的查询现在看起来像这样:
SELECT CARS.car_id
category_id,
CATEGORIES.category_name,
value,
FROM CARS
left join (SELECT BATTERY.battery_category_id AS category_id,
BATTERY.car_id AS car_id,
BATTERY.value AS value
FROM BATTERY
WHERE `BATTERY`.`battery_category_id` IN (1)
UNION
SELECT TECHNICAL_DATA.technical_category_id AS category_id,
TECHNICAL_DATA.car_id AS car_id,
TECHNICAL_DATA.value AS value
FROM TECHNICAL_DATA
WHERE `TECHNICAL_DATA`.`technical_category_id` IN (3))
tt
ON CARS.car_id = tt.car_id
left join CATEGORIES
ON category_id = CATEGORIES.id
所以我想要的结果是这样的,因为我只想获取 category_id 1 在电池表中的数据:
car_id category_id category_name technical_value
1 1 engine power 125 kW
1 3 release year 2008
但是通过上面的查询,我得到了这个,技术表中的 category_id 1 包括在内,这不是我想要的:
car_id category_id category_name value
1 1 engine power 125 kW
1 1 seats 125 kW
1 3 release year 2008
如何排除“座位”行?
对于您想要的结果,我不明白为什么需要cars
表。 然后,您似乎需要一个附加键来根据它所指的表连接到categories
。
所以,我建议:
SELECT tt.*, c.category_name
FROM ((SELECT b.battery_category_id AS category_id,
b.car_id AS car_id, b.value AS value,
'battery' as which
FROM BATTERY b
WHERE b.battery_category_id IN (1)
) UNION ALL
(SELECT td.technical_category_id AS category_id,
td.car_id AS car_id, td.value AS value,
'technical' as which
FROM TECHNICAL_DATA td
WHERE td.technical_category_id IN (3)
)
) tt LEFT JOIN
CATEGORIES c
ON c.id = tt.category_id AND
c.category_type = tt.which;
也就是说,如果加入categories
需要“隐藏”数据(例如类型),您的数据 model 似乎有问题。 但是,这不在问题的 scope 范围内。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.