如何在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)
答案 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