我遇到了这个问题,我想首先从一个由id排序的mysql数据库中选择8个元素。然后,我想选择另一组结果(8项),这一次按日期顺序DESC,但这里的结果,我想确保它们不是已经在fisrt查询的顺序,按id。数据位于同一个表中,只是有不同的列,如id、name、date、。
到目前为止,我已经尝试编写不同的查询来获取数据,但是数据包含一些类似的项,这正是我不想要的。这是我写的问题;
这将返回按id DESC排序的8个项。
SELECT name FROM person order by id DESC LIMIT 8;这还会返回8项,但按日期进行排序。
SELECT name FROM person order by date DESC LIMIT 8;返回的数据包含重复项!
发布于 2022-11-11 17:07:33
您可以使用嵌套查询,首先选择前8个id,然后选择按日期排序的前8个记录,但不包括这些id:
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发布于 2022-11-11 16:13:47
第一个查询应该返回表的主键。如果name是关键,那么就这样吧,但可能id字段是更好的选择。
然后我们可以这样编写查询:
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;我们还可以使用排除连接,这通常比较慢,但在本例中减少了一个嵌套级别,因此它可能会做得更好:
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()选项。
https://stackoverflow.com/questions/74405200
复制相似问题