0

多くのギャラリーの写真を含むテーブルgal_photosがあります

  • id (整数)
  • Gall_id (整数)
  • ファイル名 (varchar)
  • 位置 (整数)
  • プレビュー (tinyint 1)
  • date_add (日時)

ここで、各gal_idの1つの写真のリスト(要約プレビュー用)を取得したいと思いますが、プレビュー1がある場合はこれ、それ以外の場合は位置番号が最も小さい写真です。最終的にdate_addでソート

select * 
from gall_photos 
where (preview = 1 or position = min(position)) 
group by gall_id 
order by date_add

このクエリはエラーを返します (「or position = min(position)」が使用されている場合)

どうぞ、何か考えはありますか?

編集 (12.1. 18:50UTC): 1 つのギャラリー (gall_id) で複数の写真のプレビューを確認することが可能です。次に、そのうちの 1 つが必要です。これも最下位の位置です。

4

5 に答える 5

1

あなたはこれを行うことができます

select * 
from gall_photos x 
where (preview = 1 or (position = 
                             (SELECT min(x2.position)
                              FROM gall_photos x2 
                              WHERE x.gall_id = x2.gall_id
                              Group By x2.gall_id)
                      and not exists 
                              (select 1 
                               from gall_photos x2 
                               where x2.gall_id=x.gall_id 
                               and x2.preview=1)
                        )
       );

SQL フィドルのデモ

于 2013-01-11T17:20:49.380 に答える
0

WHERE CLAUSEは許可されていませんGROUP BY

使用HAVING:

select * 
from gall_photos 
group by gall_id 
having (preview = 1 or position = min(position)) 
order by date_add
于 2013-01-11T19:18:49.533 に答える
0
select id, gall_id, filename, position, preview, date_add
from gall_photos 
where position in (select min(position)from gall_photos) 
or
exists (select preview from gall_photos where preview = 1)
group by gall_id
order by date_add;
于 2013-01-11T17:35:26.623 に答える
0

このようなものはどうですか...

SELECT a.gall_id
     , COALESCE(c.position,a.position) position
  FROM gall_photos a
  JOIN 
     ( SELECT gall_id,MIN(position) min_position FROM gall_photos GROUP BY gall_id) b 
    ON b.gall_id = a.gall_id 
   AND b.min_position = a.position
  LEFT
  JOIN gall_photos c
    ON c.gall_id = a.gall_id
   AND c.preview = 1;
于 2013-01-11T17:52:06.273 に答える
0

rs の解決策は非常に近いですが、preview=1 のレコードがあり、gal_id の最低位置がない場合、彼は preview=1 と最低位置の両方を提供します。だから私はあなたが欲しいと思う:

select * 
from gall_photos g1
where preview = 1
  or not exists (select * from gall_photos g2 where g2.gall_id=g1.gall_id and g2.preview=1)
  and position = (select min(g3.position) from gall_photos g3
    where g3.gall_id=g1.gall_id)
order by date_add
于 2013-01-11T17:46:33.973 に答える