我有这个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(在内部语句中)
如果有人可以给我一些代码,我将非常感激
由于
答案 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