繁体   English   中英

使用联合将多列合并为一列,排除具有相同 ID 的结果

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM