【问题标题】:MySQL join dataset on at least X itemsMySQL 在至少 X 个项目上加入数据集
【发布时间】:2020-09-25 18:08:16
【问题描述】:

我在SQL Fiddle 中的问题。

如何通过多对多映射表将表 A 中的所有元素与表 B 中的所有元素连接起来,即使不存在任何关系?我的LEFT JOIN 解决方案没有给出我期望的结果。


详情:

鉴于这些表格:

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;

【问题讨论】:

  • 我不知道为什么这会被否决。这个问题似乎很清楚,有样本数据,甚至有一个小提琴。

标签: mysql sql mysql-8.0


【解决方案1】:

使用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;

【讨论】:

  • 哇,谢谢戈登!我不精通CROSS JOINs,但现在会阅读文档。
猜你喜欢
  • 2011-10-21
  • 1970-01-01
  • 2014-07-01
  • 2015-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-13
  • 2020-12-30
相关资源
最近更新 更多