首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL从sql语句中选择不在其他返回数据中的位置

问MySQL从sql语句中选择不在其他返回数据中的位置
EN

Stack Overflow用户
提问于 2022-11-11 16:05:16
回答 2查看 50关注 0票数 1

我遇到了这个问题,我想首先从一个由id排序的mysql数据库中选择8个元素。然后,我想选择另一组结果(8项),这一次按日期顺序DESC,但这里的结果,我想确保它们不是已经在fisrt查询的顺序,按id。数据位于同一个表中,只是有不同的列,如id、name、date、。

到目前为止,我已经尝试编写不同的查询来获取数据,但是数据包含一些类似的项,这正是我不想要的。这是我写的问题;

这将返回按id DESC排序的8个项。

代码语言:javascript
复制
SELECT name FROM person order by id DESC LIMIT 8;

这还会返回8项,但按日期进行排序。

代码语言:javascript
复制
SELECT name FROM person order by date DESC LIMIT 8;

返回的数据包含重复项!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-11-11 17:07:33

您可以使用嵌套查询,首先选择前8个id,然后选择按日期排序的前8个记录,但不包括这些id:

代码语言:javascript
复制
SELECT name FROM person 
WHERE id NOT IN
  (SELECT id FROM person order by id DESC LIMIT 8) AS exc
ORDER BY date DESC LIMIT 8
票数 1
EN

Stack Overflow用户

发布于 2022-11-11 16:13:47

第一个查询应该返回表的主键。如果name是关键,那么就这样吧,但可能id字段是更好的选择。

然后我们可以这样编写查询:

代码语言:javascript
复制
SELECT p.name 
FROM Person p
WHERE NOT EXISTS (
    SELECT 1
    FROM (SELECT id FROM Person ORDER BY id DESC LIMIT 8) p0
    WHERE p0.id = p.id
)
ORDER BY p.date DESC 
LIMIT 8;

我们还可以使用排除连接,这通常比较慢,但在本例中减少了一个嵌套级别,因此它可能会做得更好:

代码语言:javascript
复制
SELECT p.name
FROM Person p
LEFT JOIN (
    SELECT id 
    FROM Person 
    ORDER BY id DESC 
    LIMIT 8
) p0 ON p0.id = p.id
WHERE p0.id is null
ORDER BY p.date DESC
LIMIT 8;

要记住的另一件事是,MySQL严格规定哪些类型的子查询可以使用LIMIT关键字。具体来说,您需要它成为一个派生表。我知道排除联接选项应该有条件,但我不太确定NOT EXISTS()选项。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74405200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档