簡體   English   中英

沒有WHERE子句的MySQL LEFT JOIN不返回空行

[英]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

SQLFIDDLE示例

請嘗試以下操作:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM