SQL在ID IN中仅选择1行

时间:2017-09-04 11:45:41

标签: php mysql sql

如何在sql请求中为每个ID仅获取1张照片?

我的画廊表:

+----+----------+
| 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 我从gallery 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)

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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