Mysql 使用union将多列合并为一列,排除具有相同id的结果
我想将多个表中的列连接到一列中,在我的例子中,将列“battery\u value”和“technical\u value”连接到列“value”中。我只想获取给定category_id的数据,但由于UNION,我也从其他表获取数据 我有4张桌子: 表:汽车Mysql 使用union将多列合并为一列,排除具有相同id的结果,mysql,sql,database,Mysql,Sql,Database,我想将多个表中的列连接到一列中,在我的例子中,将列“battery\u value”和“technical\u value”连接到列“value”中。我只想获取给定category_id的数据,但由于UNION,我也从其他表获取数据 我有4张桌子: 表:汽车 car_id model_name 1 e6 表:电池 battery_category_id car_id battery_value 1 1 12
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
但通过上面的查询,我得到了这样一个结果,技术表中的类别_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
如何获得排除“seats”行的结果?对于您想要的结果,我不明白为什么需要cars表。然后,您似乎需要一个额外的键,用于根据所引用的表连接到类别 因此,我建议:
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;
也就是说,如果连接到类别需要隐藏数据,例如类型,那么您的数据模型似乎有问题。但是,这超出了问题的范围。@草莓嗨!是的,我排除了car表中的许多其他信息,只是为了说明手头的问题。我的想法是为电池信息和技术信息创建单独的表,因为电池类别id和技术类别id是各自表中的主键,管理切换顺序,将进行编辑。然后我将使用他们的主键来找出它是什么类型的类别,因为一辆车可以有多个电池数据,所以我在这个场景中只添加了1个。如果您对技术类别1不感兴趣,为什么不将其过滤掉呢?我无法在后面的表中自信地说出主键是什么。请参阅@ScootCork,每个表中有100多个类别,因此我希望能够按我确实想要的少数类别进行筛选,而不是按我不想要的所有类别进行筛选。