2013-06-28 80 views
1

我試圖檢索單個圖像由用戶設定爲從表如下主畫面:選擇主照片首先上傳照片

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語句?

+3

見COALESCE()。 – Strawberry

回答

1

我在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