MySQL内连接带有LIMIT限制到左表

10

我有这个数据库查询

SELECT *
FROM (`metadata` im)
INNER JOIN `content` ic ON `im`.`rev_id`  = `ic`.`rev_id`
WHERE `im`.`id` = '00039'
AND `current_revision` = 1
ORDER BY `timestamp` DESC
LIMIT 5, 5 

该查询将结果中的总行数限制为5。我希望限制左侧表格metadata的行数为5,而不限制整个结果集。

我应该如何编写查询?


限制左表格为5是什么意思? - S L
@experimentX,metadata中的1行可能与content中的n行相关。我想构造查询以返回5n行,而不是5行。 - Mr Hyde
@Shakti Singh,这就是我正在考虑的,只是想可能有一种更直接的方式。 - Mr Hyde
你能添加你的表结构吗? - S L
3个回答

17

如果您考虑自己要做什么,您实际上并没有对 metadata 进行选择查询。

您需要首先进行子查询。

尝试:

SELECT *
FROM ((select * from metadata limit 5) im)
INNER JOIN `content` ic ON `im`.`rev_id`  = `ic`.`rev_id`
WHERE `im`.`id` = '00039'
AND `current_revision` = 1
ORDER BY `timestamp` DESC

2
这将获取“元数据”的前5行,然后对该有限数据集进行进一步查询。 - Mazatec
@Ash - 是的,这就是他问的。 “我想将左表元数据限制为5个”。 - Christian Payne

0

嗯,我想你的意思是使用LEFT JOIN而不是INNER JOIN

    SELECT DISTINCT *
    FROM (`metadata` im)
    INNER JOIN `content` ic ON `im`.`rev_id`  = `ic`.`rev_id`
    WHERE `im`.`id` = '00039'
    AND `current_revision` = 1
    ORDER BY `timestamp` DESC
    LIMIT 5, 5 

尝试过了!不是我想要的。左连接将包括在“左”表中没有对应项的任何记录。内连接将仅包括两个表共有的记录。 - Mr Hyde
虽然我不建议使用我的 - S L

0

这里还有另一种可能的方法:

SET @serial=0;
SET @thisid=0;

SELECT 
   @serial := IF((@thisid != im.id), @serial + 1, @serial), 
   @thisid := im.id,
   * 
FROM (`metadata` im)
WHERE `im`.`id` = '00039'
AND `current_revision` = 1
AND @serial < 5
ORDER BY `timestamp` DESC

这个还没有经过测试。如果你在实现它的过程中遇到问题,请告诉我,我可以详细解释。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接