MySQL 加入至少 X 个项目的数据集
MySQL join dataset on at least X items
我的问题在 SQL Fiddle.
如何通过多对多映射 table 将 table A 中的所有元素与 table B 中的所有元素连接起来,即使不存在任何关系?我的 LEFT JOIN
解决方案没有给出我期望的结果。
详情:
鉴于这些 table:
CREATE TABLE `user` (
id INT PRIMARY KEY NOT NULL,
email VARCHAR(100) NOT NULL
);
CREATE TABLE `event` (
id INT NOT NULL,
start_time DATETIME NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE `event_response` (
id INT PRIMARY KEY NOT NULL,
user_id INT NOT NULL,
event_id INT NOT NULL,
response VARCHAR(5) NOT NULL,
FOREIGN KEY (user_id)
REFERENCES `user`(id)
ON DELETE CASCADE,
FOREIGN KEY (event_id)
REFERENCES `event`(id)
ON DELETE CASCADE
);
而这个种子数据:
-- create some users
INSERT INTO `user`(`id`, email)
VALUES
(1, 'abc1@gmail.com'),
(2, 'abc2@gmail.com'),
(3, 'abc3@gmail.com');
-- create two events
INSERT INTO `event`(`id`, start_time)
VALUES
(1, '2020-09-01'),
(2, '2020-10-01');
-- Only 3 users have responded to the events
INSERT INTO `event_response`(`id`, user_id, event_id, response)
VALUES
(1, 1, 1, 'yes'),
(2, 2, 1, 'no'),
(3, 3, 2, 'yes');
我需要这样的报告:
start_time, email, response
"2020-09-01", abc1@gmail.com, yes
"2020-09-01", abc2@gmail.com, no
"2020-09-01", abc3@gmail.com, <NO RESPONSE>
"2020-10-01", abc1@gmail.com, <NO RESPONSE>
"2020-10-01", abc2@gmail.com, <NO RESPONSE>
"2020-10-01", abc3@gmail.com, yes
我试过的查询(但没有给出满意的结果):
SELECT
e.start_time,
u.email,
COALESCE(er.response, '<NO RESPONSE>') AS response
FROM `user` AS u
LEFT JOIN event_response AS er ON u.id = er.user_id
LEFT JOIN `event` AS e ON er.event_id = e.id
ORDER BY e.start_time ASC;
使用 cross join
生成行并使用 left join
引入值:
select e.*, u.*, er.response
from event e cross join
user u left join
event_response er
on er.user_id = u.id and er.event_id = e.id;
我的问题在 SQL Fiddle.
如何通过多对多映射 table 将 table A 中的所有元素与 table B 中的所有元素连接起来,即使不存在任何关系?我的 LEFT JOIN
解决方案没有给出我期望的结果。
详情:
鉴于这些 table:
CREATE TABLE `user` (
id INT PRIMARY KEY NOT NULL,
email VARCHAR(100) NOT NULL
);
CREATE TABLE `event` (
id INT NOT NULL,
start_time DATETIME NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE `event_response` (
id INT PRIMARY KEY NOT NULL,
user_id INT NOT NULL,
event_id INT NOT NULL,
response VARCHAR(5) NOT NULL,
FOREIGN KEY (user_id)
REFERENCES `user`(id)
ON DELETE CASCADE,
FOREIGN KEY (event_id)
REFERENCES `event`(id)
ON DELETE CASCADE
);
而这个种子数据:
-- create some users
INSERT INTO `user`(`id`, email)
VALUES
(1, 'abc1@gmail.com'),
(2, 'abc2@gmail.com'),
(3, 'abc3@gmail.com');
-- create two events
INSERT INTO `event`(`id`, start_time)
VALUES
(1, '2020-09-01'),
(2, '2020-10-01');
-- Only 3 users have responded to the events
INSERT INTO `event_response`(`id`, user_id, event_id, response)
VALUES
(1, 1, 1, 'yes'),
(2, 2, 1, 'no'),
(3, 3, 2, 'yes');
我需要这样的报告:
start_time, email, response
"2020-09-01", abc1@gmail.com, yes
"2020-09-01", abc2@gmail.com, no
"2020-09-01", abc3@gmail.com, <NO RESPONSE>
"2020-10-01", abc1@gmail.com, <NO RESPONSE>
"2020-10-01", abc2@gmail.com, <NO RESPONSE>
"2020-10-01", abc3@gmail.com, yes
我试过的查询(但没有给出满意的结果):
SELECT
e.start_time,
u.email,
COALESCE(er.response, '<NO RESPONSE>') AS response
FROM `user` AS u
LEFT JOIN event_response AS er ON u.id = er.user_id
LEFT JOIN `event` AS e ON er.event_id = e.id
ORDER BY e.start_time ASC;
使用 cross join
生成行并使用 left join
引入值:
select e.*, u.*, er.response
from event e cross join
user u left join
event_response er
on er.user_id = u.id and er.event_id = e.id;