Mysql 具有不匹配行的笛卡尔连接

Mysql 具有不匹配行的笛卡尔连接,mysql,join,left-join,Mysql,Join,Left Join,当左联接不匹配时,我无法使查询工作。我认为这与笛卡尔连接有关。下面是一个有效的查询: select i.id, z.WeekNum, 0, count(s.id) from my156rowtable as i left JOIN (select YEARWEEK( @startDate ) WeekNum, @startDate := date_add( @startDate, interval 1 week ) EndOfWeek from (select @startDate := '2

联接不匹配时,我无法使查询工作。我认为这与笛卡尔连接有关。下面是一个有效的查询:

select i.id, z.WeekNum, 0, count(s.id) from my156rowtable as i
left JOIN (select YEARWEEK( @startDate ) WeekNum, @startDate := date_add( @startDate, interval 1 week ) EndOfWeek
from 
(select @startDate := '2016-04-20') sqlv,
my156rowtable
limit 156 ) z
on 1=1
where i.id = 2 and s.id = 0
group by z.WeekNum, s.id
这带来了:

|             2 |  201836 | 0 |        1 |
|             2 |  201837 | 0 |        1 |
|             2 |  201838 | 0 |        1 |
|             2 |  201839 | 0 |        1 |
|             2 |  201840 | 0 |        1 |
|             2 |  201841 | 0 |        1 |
但是在我的156RowTable中添加了
stats\u后,我得到了缺少的行
201838
201839

select i.id, z.WeekNum, 0, count(s.id) from my156rowtable as i
left JOIN (select YEARWEEK( @startDate ) WeekNum, @startDate := date_add( @startDate, interval 1 week ) EndOfWeek
from 
(select @startDate := '2016-04-20') sqlv,
my156rowtable
limit 156 ) z
on 1=1
left join stats_to_my156rowtable as s
on i.id = s.sid and z.WeekNum = YearWeek(s.date)
where i.id = 2 and s.id = 0
group by z.WeekNum, s.id
返回:

|             2 |  201836 | 0 |                  8 |
|             2 |  201837 | 0 |                 14 |
|             2 |  201840 | 0 |                  9 |

如果没有匹配项,我希望
计数
0
。我想我可以在以后使用
案例
合并
来解决这个问题,但没有任何回报,我觉得运气不太好。

您在
WHERE
子句右表中的条件将
左连接
转换为
内部连接
。基本上,它会过滤掉id=0的行,包括
NULL
行。也许,将条件移动到
ON
子句将解决您的问题

select i.id, z.WeekNum, 0, count(s.id) 
from my156rowtable as i
left JOIN (
    select YEARWEEK( @startDate ) WeekNum, @startDate := date_add( @startDate, interval 1 week ) EndOfWeek
    from (
        select @startDate := '2016-04-20'
    ) sqlv, my156rowtable
    limit 156 
) z on 1=1
left join stats_to_my156rowtable as s on i.id = s.sid and z.WeekNum = YearWeek(s.date) AND s.id = 0
where i.id = 2
group by z.WeekNum, s.id