我在MS SQL工作,但除了表變量,我沒有看到任何特定於MS的東西。所以如果你把它改成現有的表,它也應該在MySQL上運行。 (我不確定,但我猜MySQL應該有EXCEPT設置操作。)
-- 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列表。其中一個主要照片和另一個沒有(這是我用的地方除外)。 (2)將照片表分別加入到他們兩個中以獲取照片ID。對於第一個列表,它是用X標記的,第二個列表是所有照片ID的最小值。 (3)兩者結合。 (4)將它加入地點和照片。
在MS SQL它工作ANG給出上述用於樣本數據如下:
plid plname phid phname plid primary_pic
----------- -------------- ----------- -------------- ----------- -----------
1 aaa 2 aaa_2.jpg 1 X
2 bbb 5 bbb_1.jpg 2
見COALESCE()。 – Strawberry