子查询中的Mysql LIMIT

Jov*_*van 1 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
        )
Run Code Online (Sandbox Code Playgroud)

我想从表中选择所有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      |
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢

rai*_*7ow 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;
Run Code Online (Sandbox Code Playgroud)

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

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

实际上很容易用这个条件更新我的查询:只需替换

WHERE is_top_story = 1
Run Code Online (Sandbox Code Playgroud)

WHERE is_top_story = 1 AND section = 1
Run Code Online (Sandbox Code Playgroud)

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

    SELECT id, is_top_story 
      FROM articles 
     WHERE section = 1
  ORDER BY times DESC;
Run Code Online (Sandbox Code Playgroud)

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

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

  • MySQL在子查询中还不支持带有`IN`的`LIMIT`子句,所以这是一个不错的选择. (2认同)