MYSQL INSERT 和 JOIN return 单个结果,应该 return 多个结果
MYSQL INSERT and JOIN return single result, should return multiple results
Table 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',而 Day-B 和 Day-2 将被标记为 'Dog'。 'Cat' 始终与 '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,尽管它们都是星期五。
在我的 table.
中,A 天和 B 天可能有几个月的不同
我想要的table结果:
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() 匹配是否可以有多个结果?
你其实很接近。 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_B 中所有具有 NULL 值的行DAY_2。因此,如果我们消除 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
这似乎是我们想要的。
祝你好运。
Table 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',而 Day-B 和 Day-2 将被标记为 'Dog'。 'Cat' 始终与 '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,尽管它们都是星期五。 在我的 table.
中,A 天和 B 天可能有几个月的不同我想要的table结果:
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() 匹配是否可以有多个结果?
你其实很接近。 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_B 中所有具有 NULL 值的行DAY_2。因此,如果我们消除 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
这似乎是我们想要的。
祝你好运。