2017-09-04 80 views
-2

如何在我的sql请求中为每个ID只获取1张照片?SQL只选择ID中的1行IN

我的画廊表:

+----+----------+ 
| id | name  | 
+----+----------+ 
| 1 | gallery1 | 
| 2 | gallery2 | 
| 3 | gallery3 | 
+----+----------+ 

和照片表:

+----+------------+------------+ 
| id | name | gallery_id | 
+----+------------+------------+ 
| 1 | photo1.jpg |  1  | 
| 2 | photo2.jpg |  1  | 
| 3 | photo3.jpg |  2  | 
| 4 | photo4.jpg |  3  | 
| 5 | photo5.jpg |  3  | 
| 6 | photo6.jpg |  3  | 
+----+------------+------------+ 

我使用MySQL 我选择从画廊的SQL我的画廊,然后我想获得一个照片从照片SQL每一行。你能帮我怎么做到吗?

foreach($this->gallery as $val){ 
     $this->arr_id = $this->arr_id.$val['id'].','; 
     } 
     $this->arr_id = trim($this->arr_id, ','); 
     echo $this->arr_id; (4,3,2,1) 
+1

不清楚你想要什么,请更好地解释。你想为每个画廊选择一张照片还是其他的?显示您的现有SQL –

+0

是的,我只想为每个画廊获取仅一张照片 –

+0

如果有多个潜在候选人,那么您有什么标准来决定您希望在输出中选择哪一个? – symcbean

回答

0

您需要使用一些聚合函数和分组过滤按类别单张照片,如下:

SELECT min(id) as photo_id FROM photos GROUP BY gallery_id 

现在,你可以利用这个信息,并用它来获得单人照每画廊:

SELECT 
    * 
FROM 
    photos 
WHERE 
    id IN (SELECT 
      MIN(id) AS photo_id 
     FROM 
      photos 
     GROUP BY gallery_id) 

可以使用JOIN也代替WHERE IN

SELECT 
    * 
FROM 
    photos 
     JOIN 
    (SELECT 
     MIN(id) AS photo_id 
    FROM 
     photos 
    GROUP BY gallery_id) single ON (photos.id = single.photo_id) 

如果你想画廊名字也,JOIN以上gallery表还:

SELECT 
    * 
FROM 
    photos 
     JOIN 
    gallery ON (photos.gallery_id = gallery.id) 
     JOIN 
    (SELECT 
     MIN(id) AS photo_id 
    FROM 
     photos 
    GROUP BY gallery_id) single ON (photos.id = single.photo_id) 
0

随机照片

SELECT * 
FROM gallery G 
INNER JOIN 
    (
     SELECT id AS photo_id, gallery_id 
     FROM photos 
     ORDER BY RAND() 
     LIMIT 1 
    ) p ON G.id = p.gallery_id 

第一张照片:

SELECT * 
FROM gallery G 
INNER JOIN 
    (
     SELECT MIN(id) AS photo_id, gallery_id 
     FROM photos 
     GROUP BY gallery_id 
    ) p ON G.id = p.gallery_id 

最后一张照片:

SELECT * 
FROM gallery G 
INNER JOIN 
    (
     SELECT MAX(id) AS photo_id, gallery_id 
     FROM photos 
     GROUP BY gallery_id 
    ) p ON G.id = p.gallery_id 
+0

第一张图片仅返回一张图片的1张照片!?!?! – Strawberry

+0

@Strawberry'LIMIT 1'不是吗? –

+0

我认为OP每个图库需要一张照片 - 就像其他查询一样。 – Strawberry