我有这个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(在内部语句中)
如果任何可以给我一些代码,我将非常感激
谢谢
这个怎么样:
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)
| 归档时间: |
|
| 查看次数: |
16892 次 |
| 最近记录: |