【问题标题】:Inner join statement with limit in one of three tables在三个表之一中具有限制的内部连接语句
【发布时间】:2013-03-08 18:54:26
【问题描述】:

我正在尝试从三个表(照片、相册、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 张或更少照片的相册。我不希望代码这样做,无论相册有多少张照片,我都希望显示相册的 LIMIT OF 5 张照片。

其他人告诉我你做不到,我相信不是这样,因为SQL语言很复杂,我认为我们应该有工具来做。

有没有办法以适当的方式做到这一点?

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

【问题讨论】:

  • 请添加示例数据和预期输出
  • 在我分享的链接中,你可以找到预期的输出!

标签: mysql sql inner-join sql-limit


【解决方案1】:

由于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

子查询中的 Order by 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

【讨论】:

  • 这是为 MySQL 而不是 TSQL。 MySQL 使用 LIMIT,而不是 TOP。
【解决方案2】:

尝试将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

这会按顺序计算照片的数量,而不仅仅是相册中的照片数量。

【讨论】:

  • 现在输出数据有 4 张照片的限制!如何将其更改为最大显示 5 张?
  • @TomiSebastiánJuárez。 . .我把比较倒过来了。试试修改后的版本。顺便说一句,您应该学会使用“明智的”别名,例如“a”代表专辑,“p”代表照片。它使 SQL 更易于阅读。
  • 是的,我希望学习,这只是为了工作。你能推荐一些适合学习的书籍吗?并感谢您的明确和出色的答案!
  • @TomiSebastiánJuárez。 . .刚好写过这么一本书,amazon.com/Data-Analysis-Using-SQL-Excel/dp/0470099518/…
  • 我不敢相信是你,我没有看到你的名字。我开始学习系统工程,让我告诉你,我在这里经常听到你的名字
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-20
  • 2018-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-24
  • 1970-01-01
相关资源
最近更新 更多