选择主要照片(如果存在),然后选择第一张上传

时间:2013-06-28 10:27:26

标签: mysql

我正在尝试将用户设置的单张图片检索为表格中的主要图片,如下所示:

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语句进行查询?

1 个答案:

答案 0 :(得分: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中,它可以为上面的示例数据提供以下内容:

plid        plname         phid        phname         plid        primary_pic
----------- -------------- ----------- -------------- ----------- -----------
1           aaa            2           aaa_2.jpg      1           X
2           bbb            5           bbb_1.jpg      2