mySQL 多重联接,结果行为空
Posted
技术标签:
【中文标题】mySQL 多重联接,结果行为空【英文标题】:mySQL multiple Join with empty result line 【发布时间】:2013-04-07 10:43:38 【问题描述】:我有两个表 CLIENSTS
和 PRICES
,我想加入它们以计算每个项目类型的总价格金额,每年。
我的查询必须对每个项目的值求和,按类型对它们进行分组,然后将它们与客户表中相应项目的类型数量相乘;如果所选年份没有项目,则也显示空值。
这是我的桌子:
CLIENTS
| name | item_A | item_B | item_C |
| X | 10 | 10 | 10 |
| Y | 5 | 15 | 0 |
| Z | 0 | 0 | 20 |
PRICES
| item | item_type | year | value |
| a1 | A | 2010 | 1 |
| a2 | A | 2010 | 2 |
| b1 | B | 2010 | 2 |
| b2 | B | 2010 | 3 |
| c1 | C | 2010 | 3 |
| a1 | A | 2011 | 4 |
| b1 | B | 2011 | 5 |
我正在寻找一个能够为所选的每一年执行后续结果的查询:
2010
| name | price_A | price_B | price_C |
| X | 30 | 60 | 30 |
| Y | 15 | 90 | 0 |
| Z | 0 | 0 | 60 |
2011
| name | price_A | price_B | price_C |
| X | 40 | 50 | none/null/zero |
| Y | 20 | 75 | none/null/zero |
| Z | 0 | 0 | none/null/zero |
这是我的尝试,但不幸的是它在第一年(2010 年)正确执行,第二年(2011 年)没有返回任何行。
我想这是由于第二年没有total_C
resutls 的第三次加入。
哪个是要求 mysql 加入表“如果结果存在”或将值设置为“none/null/zero”的正确方法?
SELECT
`name`,
`item_A` * `total_A`.`total_value` AS `price_A`,
`item_B` * `total_B`.`total_value` AS `price_B`,
`item_C` * `total_C`.`total_value` AS `price_C`
FROM `CLIENTS`
JOIN
(
SELECT
`item_type`,
SUM(`value`) AS `total_value`
FROM `PRICES`
WHERE `item_type`='A' AND `year` LIKE '2010'
GROUP BY `item_type`
) AS `total_A`
JOIN
(
SELECT
`item_type`,
SUM(`value`) AS `total_value`
FROM `PRICES`
WHERE `item_type`='B' AND `year` LIKE '2010'
GROUP BY `item_type`
) AS `total_B`
JOIN
(
SELECT
`item_type`,
SUM(`value`) AS `total_value`
FROM `PRICES`
WHERE `item_type`='C' AND `year` LIKE '2010'
GROUP BY `item_type`
) AS `total_C`
【问题讨论】:
【参考方案1】:如果我正确理解您的问题,我认为您应该使用以下内容:
SELECT
s.year,
clients.name,
clients.item_A*s.sum_A,
clients.item_B*s.sum_B,
clients.item_C*s.sum_C
FROM
clients INNER JOIN (
SELECT
year,
SUM(CASE WHEN item_type='A' THEN value END) sum_A,
SUM(CASE WHEN item_type='B' THEN value END) sum_B,
SUM(CASE WHEN item_type='C' THEN value END) sum_C
FROM
prices
GROUP BY
year) s
ORDER BY
s.year
请看小提琴here。
在子查询中,我对 item_type 每年的总值求和。然后我正在与客户表进行笛卡尔连接。
【讨论】:
是的!谢谢你。这是一种不同的方法,您的连接子查询会生成一个更大的表,其主对角线上的值不是空值,但所有查询都比我的更快更小......广告有效!以上是关于mySQL 多重联接,结果行为空的主要内容,如果未能解决你的问题,请参考以下文章