我正在尝试从三张桌子(照片,专辑,album_photos)获取数据, 然后程序在专辑表中搜索用户的专辑,然后在album_photos中查找每张专辑的照片ID,然后,对于每个ID,按照ID查看照片表中的所有数据。
昨天我问过这样的问题:Inner join with 3 tables,但现在,我认为问题不同了,我想知道如何通过inner join
为请求添加限制。
所以,我现在正在使用这段代码:
SELECT a.album_name, a.album_id, c.*
FROM albums a
INNER JOIN album_photos b ON a.album_id = b.album_id
INNER JOIN photos c ON b.photo_id = c.photo_id
WHERE (
SELECT COUNT(*)
FROM album_photos d
WHERE b.album_id = d.album_id
AND d.nick = :nick
) <=5
好的,这段代码选择了包含5张或更少照片的相册。我不希望代码这样做,无论有多少张照片都有,我想用限量5张照片来展示这张专辑。
其他人告诉我你不能这样做,我相信事实并非如此,因为SQL语言非常复杂,我认为我们应该有这个工具来做。
有没有办法以正确的方式做到这一点?
*在我上面分享的链接中,我举了一个关于输出数据的例子。
答案 0 :(得分:1)
尝试将where
子句更改为:
WHERE (
SELECT COUNT(*)
FROM album_photos d
WHERE d.album_id = b.album_id and
d.photo_id <= b.photo_id
AND d.nick = :nick
) <= 5
按顺序计算照片数量,而不仅仅是相册中的照片数量。
答案 1 :(得分:0)
由于album_photos在照片和相册之间存在映射关系,因此您可以使用TOP指定要加入的照片数量:
SELECT a.album_name, a.album_id, p.*
FROM albums a
INNER JOIN album_photos ap ON
ap.photo_id = (select top 5 photo_id from album_photos where a.album_id = ap.album_id order by photo_id)
INNER JOIN photos p ON ap.photo_id = p.photo_id
子查询中的photo_id订单将确保返回相同的5张(或更少)照片
编辑评论。修改使用MySql LIMIT而不是T-SQL TOP
SELECT a.album_name, a.album_id, p.*
FROM albums a
INNER JOIN album_photos ap ON
ap.photo_id = (select photo_id from album_photos where a.album_id = ap.album_id order by photo_id LIMIT 0, 5)
INNER JOIN photos p ON ap.photo_id = p.photo_id