gpt4 book ai didi

sql - 左连接和右连接查询

转载 作者:行者123 更新时间:2023-12-01 00:34:06 25 4
gpt4 key购买 nike

一位 friend 请我帮忙构建一个查询,该查询将显示每个型号在每个月的每一天售出多少件,当特定型号在特定日期没有售出件时显示零,即使没有售出当天出售任何型号的元素。我想出了下面的查询,但它没有按预期工作。我只得到已售出型号的记录,我不知道为什么。

select days_of_months.`Date`,
m.NAME as "Model",
count(t.ID) as "Count"
from MODEL m
left join APPLIANCE_UNIT a on (m.ID = a.MODEL_FK and a.NUMBER_OF_UNITS > 0)
left join NEW_TICKET t on (a.NEW_TICKET_FK = t.ID and t.TYPE = 'SALES'
and t.SALES_ORDER_FK is not null)
right join (select date(concat(2009,'-',temp_months.id,'-',temp_days.id)) as "Date"
from temp_months
inner join temp_days on temp_days.id <= temp_months.last_day
where temp_months.id = 3 -- March
) days_of_months on date(t.CREATION_DATE_TIME) =
date(days_of_months.`Date`)
group by days_of_months.`Date`,
m.ID, m.NAME

我创建了临时表 temp_monthstemp_days 以获取任何月份的所有日期。我正在使用 MySQL 5.1,但我试图使查询符合 ANSI。

最佳答案

您应该CROSS JOIN您的日期和模型,这样无论如何您都可以为每一对日期-模型都有一个记录,然后LEFT JOIN其他表:

SELECT  date, name, COUNT(t.id)
FROM (
SELECT ...
) AS days_of_months
CROSS JOIN
model m
LEFT JOIN
APPLIANCE_UNIT a
ON a.MODEL_FK = m.id
AND a.NUMBER_OF_UNITS > 0
LEFT JOIN
NEW_TICKET t
ON t.id = a.NEW_TICKET_FK
AND t.TYPE = 'SALES'
AND t.SALES_ORDER_FK IS NOT NULL
AND t.CREATION_DATE_TIME >= days_of_months.`Date`
AND t.CREATION_DATE_TIME < days_of_months.`Date` + INTERVAL 1 DAY
GROUP BY
date, name

您现在的做法是,在没有销售的日子里,model_id 中的 NULL 会被归为一组。

注意JOIN条件:

AND t.CREATION_DATE_TIME >= days_of_months.`Date`
AND t.CREATION_DATE_TIME < days_of_months.`Date` + INTERVAL 1 DAY

代替

DATE(t.CREATION_DATE_TIME) = DATE(days_of_months.`Date`)

这将有助于使您的查询sargable(通过索引优化)

关于sql - 左连接和右连接查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1069205/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com