内部连接语句,在三个表之一中具有限制

时间:2013-03-19 21:22:11

标签: mysql sql inner-join sql-limit

我正在尝试从三张桌子(照片,专辑,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语言非常复杂,我认为我们应该有这个工具来做。

有没有办法以正确的方式做到这一点?

*在我上面分享的链接中,我举了一个关于输出数据的例子。

2 个答案:

答案 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