如何从第三个表中获取所有记录,即使没有匹配项也可以通过另一个表的连接来区分

问题描述 投票:0回答:1

我在从表中获取所有记录时遇到问题,即使没有任何关系。我的第一个表(仓库)有一个仓库类型,它是另一个表的外键。还有一个表包含了不同仓库中可以存在的所有产品类型,它们是根据仓库类型定义的(我的仓库类型和产品类型之间的关系表)。我的目标是获取所有类型的产品,根据类型指示哪些产品已分配到仓库,哪些不是。

我用不同的方式尝试了我的查询:使用 UNION、子查询,但我没有实现我的目标。我包括最接近预期结果的查询的小提琴:

SQL 小提琴

SELECT DISTINCT w.id, w.name, wht.type AS whouse_type, APT.product_type_id, APT.product_type,
CASE
    WHEN w.type_id = APT.warehouse_type_id
        THEN "YES"
    WHEN w.type_id <> APT.warehouse_type_id
        THEN "NO"
    WHEN APT.warehouse_type_id IS NULL
        THEN "NO"
    ELSE NULL
END AS assigned
FROM warehouse w
LEFT JOIN warehouse_types wht ON w.type_id = wht.id
CROSS JOIN (
    SELECT DISTINCT pt.id AS product_type_id, pt.product_type, rel.warehouse_type_id
    FROM product_types pt 
    LEFT JOIN products_type_by_wh_types rel ON pt.id = rel.product_type_id
  ) AS APT -- all products types 
where w.id = 1
ORDER BY w.name, APT.product_type_id, type_of_warehouse;

这给了我:

+----+-------------+-------+--------------+----------+
| id | whouse_type | pt_id | product_type | assigned |
+----+-------------+-------+--------------+----------+
| 1  | NORTH       |   1   | Industry     | YES      |
+----+-------------+-------+--------------+----------+
| 1  | NORTH       |   1   | Industry     | NO       |
+----+-------------+-------+--------------+----------+
| 1  | NORTH       |   2   | Transport    | NO       |
+----+-------------+-------+--------------+----------+
| 1  | NORTH       |   3   | Chemicals    | NO       |
+----+-------------+-------+--------------+----------+
| 1  | NORTH       |   4   | Food and B   | YES      |
+----+-------------+-------+--------------+----------+
| 1  | NORTH       |   4   | Food and B   | NO       |
+----+-------------+-------+--------------+----------+

预期结果应该是:

+----+-------------+-------+--------------+----------+
| id | whouse_type | pt_id | product_type | assigned |
+----+-------------+-------+--------------+----------+
| 1  | NORTH       |   1   | Industry     | YES      |
+----+-------------+-------+--------------+----------+
| 1  | NORTH       |   2   | Transport    | NO       |
+----+-------------+-------+--------------+----------+
| 1  | NORTH       |   3   | Chemicals    | NO       |
+----+-------------+-------+--------------+----------+
| 1  | NORTH       |   4   | Food and B   | YES      |
+----+-------------+-------+--------------+----------+
mysql join union
1个回答
0
投票

正如 @Barmar 所建议的(再次感谢您!)解决方案是添加一个 GROUP BY 并为我的 CASE 使用 MAX 函数。这是最终的查询:

SELECT DISTINCT w.id, w.name, wht.type AS whouse_type, APT.product_type_id, APT.product_type,
MAX(CASE
    WHEN w.type_id = APT.warehouse_type_id
        THEN 1
    WHEN w.type_id <> APT.warehouse_type_id
        THEN 0
    WHEN APT.warehouse_type_id IS NULL
        THEN 0
    ELSE NULL
END) AS assigned
FROM warehouse w
LEFT JOIN warehouse_types wht ON w.type_id = wht.id
CROSS JOIN (
    SELECT DISTINCT pt.id AS product_type_id, pt.product_type, rel.warehouse_type_id
    FROM product_types pt 
    LEFT JOIN products_type_by_wh_types rel ON pt.id = rel.product_type_id
  ) AS APT -- all products types 
GROUP BY w.id, APT.product_type_id
ORDER BY w.name, APT.product_type_id, assigned;
© www.soinside.com 2019 - 2024. All rights reserved.