MySql 如果一个请求中的列为空,则更新选择

MySql update selection if column is null in one request

我有一个带有 2 table 的 SQL 数据库,我需要通过 ONE REQUEST 向服务器获取这些数据。

我正在尝试从 event table

中获取 startDateendDatetitle 数据

然后我也在尝试从 photo table

中获取 sourceeventId 数据

到目前为止,我的这个工作完美,但有一个问题。

SELECT event.startDate, event.endDate, event.id, event.title, photo.source, photo.eventId FROM event, photo 
WHERE event.id = 'UNIQUE ID NUMBER' AND photo.eventId = 'UNIQUE ID NUMBER';

有时,photo.eventId 等于 NULL,这意味着什么都不会 return。如果是这种情况,我唯一需要的数据是来自第一个 table event 的数据,即 startDateendDatetitle[ 三列]

然后 return 应该具有与此相同的输出:

SELECT event.startDate, event.endDate, event.id, event.title FROM event WHERE event.id = 'UNIQUE ID NUMBER';

我找到了一种方法来作弊,方法是将带有 UNION 的两个语句与下面的代码结合起来,然后在我的第二个语句中添加两个额外的 NULL 列。这允许显示 table 的数据

SELECT event.startDate, event.endDate, event.id, event.title, photo.source, photo.eventId FROM event, photo 
WHERE event.id = 'UNIQUE ID NUMBER' AND photo.eventId = 'UNIQUE ID NUMBER' 
UNION SELECT event.startDate, event.endDate, event.id, event.title, null, null FROM event WHERE event.id = 'UNIQUE ID NUMBER';

你描述的是 LEFT 连接 eventphoto 的定义:

SELECT e.startDate, e.endDate, e.id, e.title, 
       p.source, p.eventId 
FROM event e LEFT JOIN photo p 
ON p.eventId = e.id 
WHERE e.id = 'UNIQUE ID NUMBER';

如果我们使用 left join 来自 table 事件 的结果将被返回,即使在 [=26= 中没有匹配的记录]照片。 注意我修改了 WHERE 以显示两种情况的结果:匹配和 non-matching.
如果事件的 photo 中有多行,我们将每张照片一行。在这种情况下,您应该考虑对来自 photo 的字段使用 STRING_AGG(),对来自 event 的字段使用 GROUP BY。 =21=]

create TABLE event(
startDate date,
endDate date,
id int, 
title varchar(25)
  );
create table photo(
  source varchar(25),
  eventID int
  );
insert into event (id, title) values (1, 'event one'),(2,'event two');
insert into photo values('source 1',1);
SELECT 
  event.startDate, 
  event.endDate, 
  event.id, 
  event.title, 
  photo.source, 
  photo.eventId 
FROM event
LEFT JOIN photo 
ON event.id = photo.eventId 
WHERE event.id = 1 or event.id = 2;
startDate | endDate | id | title     | source   | eventId
:-------- | :------ | -: | :-------- | :------- | ------:
null      | null    |  1 | event one | source 1 |       1
null      | null    |  2 | event two | null     |    null
SELECT event.startDate, event.endDate, event.id, event.title, photo.source, photo.eventId FROM event, photo 
WHERE (event.id = 1 AND photo.eventId = 1)
or (event.id = 2 AND photo.eventId = 2);
startDate | endDate | id | title     | source   | eventId
:-------- | :------ | -: | :-------- | :------- | ------:
null      | null    |  1 | event one | source 1 |       1

db<>fiddle here