子查询中的Mysql LIMIT

时间:2012-05-07 13:38:40

标签: mysql

我有这个mysql语句,但我在子查询错误中收到LIMIT

SELECT  id
FROM    articles
WHERE  section=1 AND id NOT IN 
        (
        SELECT  id
        FROM    articles
        WHERE   is_top_story=1  ORDER BY timestamp DESC LIMIT 2
        )

我想从表中选择所有id-s,其中section = 1而id-s不在我的内部(第二)语句中

+--id--+section+-is_top_story-+--timestamp--+
|  54  |   1   |     1        |    130      |
|  70  |   2   |     0        |    129      |      
|  98  |   3   |     1        |    128      |
|  14  |   1   |     1        |    127      |
|  58  |   4   |     0        |    126      |
|  13  |   3   |     1        |    125      |
|  64  |   1   |     1        |    124      |
|  33  |   1   |     1        |    123      |

我的sql应该返回64和33(它们的section = 1和is_top_story = 1),因为54和14(在内部语句中)

如果有人可以给我一些代码,我将非常感激

由于

2 个答案:

答案 0 :(得分:6)

这个怎么样:

SELECT a.id, a.times
  FROM articles AS a
  LEFT JOIN (
       SELECT id
         FROM articles
        WHERE is_top_story =1
     ORDER BY times DESC LIMIT 2) AS ax
  USING (id)
WHERE section = 1 AND ax.id IS NULL;

当您需要子查询中的限制时,加入是一种常用的解决方法;排除逻辑的需要只是将这些'left join - joined.id IS NULL`部分添加到查询中。 )

更新:您的示例有点困惑。您引用的原始查询是“使用section = 1获取一些文章,然后取出属于2个最新top_stories的文章”。但是在你的例子中,在选择这些故事时,也应该考虑这一部分 - 忽略-...

使用该条件更新我的查询实际上非常容易:只需替换

WHERE is_top_story = 1

WHERE is_top_story = 1 AND section = 1

...但我认为在客户端代码中可能会更好地解决。首先,您发送一个简单的查询,没有任何连接:

    SELECT id, is_top_story 
      FROM articles 
     WHERE section = 1
  ORDER BY times DESC;

然后你只需要遍历获取的行集,然后忽略两个带有'is_top_story'标志的第一个元素,就像这样:

  ...
  $topStoriesToIgnore = 2;
  foreach ($rowset as $row) {
    if ($row->is_top_story && $topStoriesToIgnore-- > 0) {
      continue;  
    }
    // actual processing code goes here
  }

答案 1 :(得分:0)

我不知道这是不是你想要的,这个问题有点混乱。我不明白为什么你在同一个表中使用子查询。无论如何LIMIT与MSSQL的“TOP”相同,因此LIMIT 2应该只返回两个记录。

如果这不是您想要的,请发表评论,我将编辑我的答案:

SELECT  id
FROM    articles
WHERE  section=1 AND is_top_story != 1
ORDER BY timestamp DESC