MySql 如果一个请求中的列为空,则更新选择
MySql update selection if column is null in one request
我有一个带有 2 table 的 SQL 数据库,我需要通过 ONE REQUEST 向服务器获取这些数据。
我正在尝试从 event
table
中获取 startDate
、endDate
和 title
数据
然后我也在尝试从 photo
table
中获取 source
和 eventId
数据
到目前为止,我的这个工作完美,但有一个问题。
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
的数据,即 startDate
、endDate
和 title
[ 三列]
然后 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
连接 event
到 photo
的定义:
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
我有一个带有 2 table 的 SQL 数据库,我需要通过 ONE REQUEST 向服务器获取这些数据。
我正在尝试从 event
table
startDate
、endDate
和 title
数据
然后我也在尝试从 photo
table
source
和 eventId
数据
到目前为止,我的这个工作完美,但有一个问题。
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
的数据,即 startDate
、endDate
和 title
[ 三列]
然后 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
连接 event
到 photo
的定义:
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