MYSQL INSERT和JOIN返回单个结果,应该返回多个结果

时间:2018-01-20 19:18:44

标签: mysql date dayofweek

表XX

  Day-A       Day-1      Day-B      Day-2    Cat   Dog
---------- ---------- ---------- ---------- ----- -----
2018/01/12     NULL      NULL       NULL      Y     N
   NULL        NULL   2018/02/02    NULL      N     Y
   NULL        NULL   2018/01/26    NULL      N     Y
   NULL    2018/01/15    NULL       NULL      Y     N
   NULL        NULL      NULL    2018/01/15   N     Y
   NULL        NULL   2018/01/19    NULL      N     Y

我想要参加Day-A和Day-B,以及Day-1和Day-2。 Day-A和Day-1将被标记为' Cat&#39 ;,而Day-B和Day-2将被标记为' Dog'。 '目录'始终与“狗”

匹配
  • Day-A和Day-B需要按天匹配,例如星期一=星期一。
  • 第1天和第2天需要在同一日期匹配。

我可以进行第1天和第2天比赛,但不能进行另一场比赛。

INSERT INTO T1 (Day-A, Day-1, Day-B, Day-2, c.Cat, d.Dog)
SELECT c.Day-A, c.Day-1, d.Day-B, d.Day-2
FROM calendar AS c
    LEFT JOIN calendar AS d
    ON ((IFNULL(c.Day-1, 'x') = IFNULL(d.Day-2, 'x')
    AND IFNULL(DAYNAME(c.Day-A), 'x') = IFNULL(DAYNAME(d.Day-B), 'x'))
    WHERE c.Cat = d.Dog

我匹配第1天和第2天但不是另一对。 只显示最近的日期。 在我的情况下,只显示2018/01/19,但不是2018/1/26和2018/02/02,尽管它们都是星期五。  我表中的A日和B日可能有几个月不同。

我想要的表格结果:

Id     Day-A       Day-1      Day-B      Day-2    Cat    Dog
--- ---------- ---------- ---------- ----------  -----  -----
 1  2018/01/12     NULL   2018/01/19     NULL      Y      Y
 2  2018/01/12     NULL   2018/01/26     NULL      Y      Y
 3  2018/01/12     NULL   2018/02/02     NULL      Y      Y
 4     NULL    2018/01/15     NULL    2018/01/15   Y      Y

DAYNAME()匹配是否可以有多个结果?

1 个答案:

答案 0 :(得分:2)

你其实非常接近。 I built an SQLFiddle并在其中填入您的数据。您在上面提供的查询产生了以下结果:

Day_A       Day_1       Day_B       Day_2       Cat    Dog
(null)      (null)      (null)      (null)      N      N
(null)      (null)      (null)      (null)      N      N
(null)      (null)      (null)      (null)      N      N
(null)      (null)      (null)      (null)      N      N
2018-01-12  (null)      2018-02-02  (null)      Y      Y
2018-01-12  (null)      2018-01-26  (null)      Y      Y
(null)      (null)      (null)      (null)      N      N
(null)      (null)      (null)      (null)      N      N
(null)      (null)      (null)      (null)      N      N
(null)      (null)      (null)      (null)      N      N
(null)      2018-01-15  (null)      2018-01-15  Y      Y
2018-01-12  (null)      2018-01-19  (null)      Y      Y

乍一看,这看起来与预期结果完全不同,直到您意识到唯一的区别是DAY_A,DAY_1,DAY_B和DAY_2中所有具有NULL值的行。因此,如果我们消除DAY_A,DAY_1,DAY_B和DAY_2都为NULL的行,那么我们应该是好的:

SELECT c.Day_A, c.Day_1, d.Day_B, d.Day_2, c.Cat, d.Dog
  FROM calendar AS c
  LEFT JOIN calendar AS d
    ON IFNULL(c.Day_1, 'x') = IFNULL(d.Day_2, 'x') AND
       IFNULL(DAYNAME(c.Day_A), 'x') = IFNULL(DAYNAME(d.Day_B), 'x')
  WHERE c.Cat = d.Dog AND
        (c.DAY_A IS NOT NULL OR
         c.DAY_1 IS NOT NULL OR
         d.DAY_B IS NOT NULL OR
         d.DAY_2 IS NOT NULL)

产生

Day_A       Day_1       Day_B       Day_2       Cat    Dog
2018-01-12  (null)      2018-02-02  (null)      Y      Y
2018-01-12  (null)      2018-01-26  (null)      Y      Y
(null)      2018-01-15  (null)      2018-01-15  Y      Y
2018-01-12  (null)      2018-01-19  (null)      Y      Y

这似乎是想要的。

祝你好运。