【问题标题】:MYSQL INSERT and JOIN return single result, should return multiple resultsMYSQL INSERT 和 JOIN 返回单个结果,应该返回多个结果
【发布时间】:2018-06-29 19:39:28
【问题描述】:

表 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。第 A 天和第 1 天将被标记为“猫”,而第 B 天和第 2 天将被标记为“狗”。 “猫”总是与“狗”匹配

  • 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,尽管它们都是星期五。 我的表中的 Day-A 和 Day-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() 匹配是否可能有多个结果?

【问题讨论】:

  • 编辑您的问题以显示您尝试过的查询,即仅在 Day-A 和 Day-B 显示一个匹配项的查询。另外,编辑您的问题以显示表架构/名称
  • @SloanThrasher 感谢您纠正我。现在最好让每个人都阅读它。

标签: mysql date dayofweek


【解决方案1】:

其实你已经很接近了。 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

这似乎是我们想要的。

祝你好运。

【讨论】:

  • 对于 SELECT,它按预期工作,但不适用于 INSERT INTO。
  • 您所要做的就是将查询的 INSERT 部分添加到此选择中,然后它应该可以按照您的要求工作。
  • 我发现我的主键设置错误,因此INSERT只插入1个值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多