gpt4 book ai didi

子查询中的Mysql LIMIT

转载 作者:行者123 更新时间:2023-11-29 04:11:13 25 4
gpt4 key购买 nike

我有这个 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(在内部语句中)

谁能给我一些代码我将不胜感激

谢谢

最佳答案

这个怎么样:

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;

当您在子查询中需要限制时,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
}

关于子查询中的Mysql LIMIT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10483106/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com