我在从表中获取所有记录时遇到问题,即使没有任何关系。我的第一个表(仓库)有一个仓库类型,它是另一个表的外键。还有一个表包含了不同仓库中可以存在的所有产品类型,它们是根据仓库类型定义的(我的仓库类型和产品类型之间的关系表)。我的目标是获取所有类型的产品,根据类型指示哪些产品已分配到仓库,哪些不是。
我用不同的方式尝试了我的查询:使用 UNION、子查询,但我没有实现我的目标。我包括最接近预期结果的查询的小提琴:
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 |
+----+-------------+-------+--------------+----------+
正如 @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;