2011-09-22 97 views
1

我已经在这个主题上做了一些搜索,但非解决方案似乎工作,所以也许我的要求略有不同。mysql限制连接

基本上我有一个“内容”表和一个“file_screenshots”表。 “file_screenshots”表中的每一行都有一个“screenshot_content_id”列。我想从“内容”表中选择,加入“file_screenshots”表格,但仅为任何单个内容选择最多5个屏幕截图。

如果这是不可能的,我很乐意使用两个查询,但我不知道如何限制结果只接收每段内容的5个屏幕截图。

下面是一个例子查询:

SELECT * FROM content 
LEFT JOIN file_screenshots 
ON file_screenshots.screenshot_content_id = content.content_id 
WHERE content_type_id = 4 
+1

检查这个问题:http://stackoverflow.com/questions/1042481/mysql-join-with-limit –

+0

这:http://stackoverflow.com/questions/1442527/how-to-select - 最新 - 每个项目四项 –

+0

欢呼的链接,但我不明白如何直接使用这些答案中给出的例子给我自己的解决方案。第二个返回单个屏幕截图的所有内容的列表(而不是每个内容的5行),我无法弄清楚如何为我自己的例子重写第一个链接在所有。 – robjbrain

回答

2

假设你有你的file_screenshots表某种独特的ID列的,这应该为你工作:

SELECT 
    c.*, 
    fs.* 
FROM 
    content c 
JOIN 
    file_screenshots fs 
    ON (fs.screenshot_content_id = c.content_id) 
LEFT JOIN 
    file_screenshots fs2 
    ON (fs2.screenshot_content_id = c.content_id AND fs2.id < fs.id) 
GROUP BY 
    fs.id 
HAVING 
    COUNT(*) < 5 
ORDER BY c.content_id, fs.id 

我命名的ID列id。如果需要重命名它。

如果你想要5个最高ID的截图,请将fs2.id与fs.id进行比较。

ON (fs2.screenshot_content_id = c.content_id AND fs2.id > fs.id) 
+0

干杯真的很好,我可以预见的唯一问题是,如果没有截图,即使使用左连接,它也不会工作。对我来说,这不是一个问题,但应该注意其他人阅读:) – robjbrain

+0

@FreezeDriedPop用'LEFT JOIN'替换第一个'JOIN',并且你还应该从'content'中取得那些没有'file_screenshots'中的相应行 –