Mysql 使用union将多列合并为一列,排除具有相同id的结果

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

我想将多个表中的列连接到一列中,在我的例子中,将列“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         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多个类别,因此我希望能够按我确实想要的少数类别进行筛选,而不是按我不想要的所有类别进行筛选。