我正在尝试从下表中检索用户设置为主图片的单张图片:
SELECT p.*, ph.* FROM place AS p
INNER JOIN photo as ph
ON p.place_id = ph.place_id
WHERE ph.primary_pic = 'X';
但并非所有用户都设置了自己的主图,导致查询不返回任何内容。
IF(query is empty)
//perform SQL again with primary_pic = ''
是否有任何方法或语法可用于通过单个 SQL 语句查询此内容?
最佳答案
我在 MS SQL 中工作,但除了表变量外,我没有看到任何特定于 MS 的内容。因此,如果您将其更改为现有表,它也应该在 MySQL 上运行。 (我不确定,但我猜 MySQL 应该有 EXCEPT set 操作。)
-- sample data start
declare @place as table (plid int, plname nvarchar(100))
declare @photo as table (phid int, phname nvarchar(100), plid int, primary_pic nvarchar(1))
insert into @place values (1, 'aaa')
insert into @place values (2, 'bbb')
insert into @photo values (1, 'aaa_1.jpg', 1, '')
insert into @photo values (2, 'aaa_2.jpg', 1, 'X')
insert into @photo values (3, 'aaa_3.jpg', 1, '')
insert into @photo values (4, 'aaa_4.jpg', 1, '')
insert into @photo values (5, 'bbb_1.jpg', 2, '')
insert into @photo values (6, 'bbb_2.jpg', 2, '')
insert into @photo values (7, 'bbb_3.jpg', 2, '')
insert into @photo values (8, 'bbb_4.jpg', 2, '')
-- sample data end
-- note: @place and @photo are table variables in MS SQL
select p.*, ph2.*
from @place p inner join @photo ph2 on p.plid = ph2.plid
inner join (
select ph.plid, ph.primary_pic, min(ph.phid) phid
from @photo ph inner join
(select distinct plid from @photo where primary_pic <> 'X'
except
select distinct plid from @photo where primary_pic = 'X') hasnoprimary
on hasnoprimary.plid = ph.plid
group by ph.plid, ph.primary_pic
union
select ph.plid, ph.primary_pic, min(ph.phid) phid
from @photo ph inner join
(select distinct plid from @photo where primary_pic = 'X') hasprimary
on hasprimary.plid = ph.plid
where primary_pic = 'X'
group by ph.plid, ph.primary_pic
) trickypart on trickypart.phid = ph2.phid
方法:(1)得到两个地点ID列表。一张有主照片,另一张没有(这是我使用 EXCEPT 的地方)。 (2) 将照片表分别连接到他们两个以获得照片 ID。对于第一个列表,它是标有 X 的内容,对于第二个列表,它是所有照片 ID 中的最小值。 (3) 将两者结合起来。 (4) 将它加入回地点和照片。
在 MS SQL 中,它可以为上面的示例数据提供以下内容:
plid plname phid phname plid primary_pic
----------- -------------- ----------- -------------- ----------- -----------
1 aaa 2 aaa_2.jpg 1 X
2 bbb 5 bbb_1.jpg 2
关于mysql - 选择主照片(如果存在),否则选择第一张上传的照片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17362604/