[英]MySQL LEFT JOIN without WHERE clause returns no null rows
編輯:這是我的桌子:
CREATE TABLE IF NOT EXISTS `punch` (
`name` varchar(50) NOT NULL,
`date` varchar(50) NOT NULL,
`duration` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
INSERT INTO `punch` (`name`, `date`, `duration`) VALUES
('foo', '1', 2),
('bar', '1', 3),
('bar', '2', 5),
('foo', '3', 6),
('foo', '4', 8),
('bar', '4', 9);
我有下面的值表:
SELECT * FROM `punch` P1 WHERE P1.date BETWEEN 1 AND 3 ORDER BY P1.name , date;
結果:
name date duration
bar 1 3
bar 2 5
foo 1 2
foo 3 6
我想為日期1到3制作一個報告,如下所示:
name date duration
bar 1 3
bar 2 5
bar 3 null
foo 1 2
foo 2 null
foo 3 6
我嘗試了此查詢(請注意注釋的WHERE):
SELECT * FROM (
SELECT DISTINCT date FROM punch WHERE date BETWEEN 1 AND 3
) P1
LEFT JOIN (
SELECT * FROM punch -- WHERE name = 'bar'
) P2 ON P1.date=P2.date
ORDER BY P2.name, P1.date
我得到了結果:
date name date duration
1 bar 1 3
2 bar 2 5
1 foo 1 2
3 foo 3 6
我期待着這樣的事情:
date name date duration
2 NULL NULL NULL
3 NULL NULL NULL
1 bar 1 3
2 bar 2 5
1 foo 1 2
3 foo 3 6
現在,當我刪除注釋的WHERE時,我得到了結果:
date name date duration
3 NULL NULL NULL
1 bar 1 3
2 bar 2 5
我的問題是,當沒有WHERE子句時,為什么上面的LEFT JOIN表現得像INNER JOIN?
對於我上面的預期報告,正確的查詢是什么?
謝謝
嗨,像這樣的東西會起作用:)
SELECT DISTINCT
P1.name,
P2.date,
(SELECT PP.duration
FROM punch PP
WHERE P1.name = PP.name
AND P2.date = PP.date ) AS duration
FROM
(SELECT DISTINCT name FROM `punch`) P1,
(SELECT DISTINCT date FROM punch)P2
WHERE P2.date BETWEEN 1 AND 3
ORDER BY P1.name , P2.date
結果:
NAME DATE DURATION
bar 1 3
bar 2 5
bar 3 (null)
foo 1 2
foo 2 (null)
foo 3 6
請嘗試以下操作:
SELECT * FROM (
SELECT DISTINCT date FROM punch WHERE date BETWEEN 1 AND 3
) P1
LEFT OUTER JOIN (
SELECT * FROM punch WHERE name = 'bar'
) P2 ON P1.date=P2.date
OUTER JOIN
應回答您的問題。 它包括第二個表中的不匹配元素。
在此處查找有關其工作方式的更多信息: http : //infogoal.com/sql/sql-outer-join.htm
創建帶有日期編號的其他表,並將punch
表與此表連接。
CREATE TABLE days(day_num INT(11));
INSERT INTO days(day_num) VALUES (1),(2),(3),(4),(5);
如果需要,添加更多記錄
結果查詢-
SELECT p.* FROM days d
LEFT JOIN punch p
ON p.date = d.day_num
WHERE
d.day_num BETWEEN 1 AND 3
ORDER BY
p.name, p.date;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.