where column in from another select results with limit (mysql/mariadb)
Posted
技术标签:
【中文标题】where column in from another select results with limit (mysql/mariadb)【英文标题】: 【发布时间】:2020-04-18 12:08:10 【问题描述】:当我运行此查询时,将返回其 id 存在于从 table2 中选择的所有行
SELECT * FROM table1 WHERE id in (
SELECT id FROM table2 where name ='aaa'
)
但是当我在第二个选择中添加限制或之间:
SELECT * FROM table1 WHERE id in (
SELECT id FROM table2 where name ='aaa' limit 4
)
返回此错误:
此版本的 MariaDB 尚不支持“LIMIT & IN/ALL/ANY/SOME 子查询”
【问题讨论】:
为什么不把限制放在外层选择? 这是因为这个版本的 MariaDB 还不支持'LIMIT & IN/ALL/ANY/SOME subquery'你用的是什么版本? 阅读this 我正在使用 mariadb 10.3 我不能在其他选择中设置限制,因为我的项目中的其他选择是左连接查询并且有很多重复的 id,例如当我限制 10 时,它返回 8 或 1 或 3 或 9 行左表和右表 10 行 【参考方案1】:您使用的 LIMIT
没有 ORDER BY
。通常不建议这样做,因为这会返回任意一组行——而且这些行可能会从一次执行更改为另一次执行。
您可以将其转换为 JOIN
-- 幸运的是。如果id
在table2
中没有重复:
SELECT t1.*
FROM table1 t1 JOIN
(SELECT t2.id
FROM table2 t2
WHERE t2.name = 'aaa'
LIMIT 4
) t2
USING (id);
如果id
可以在table2
中复制,那么:
SELECT t1.*
FROM table1 t1 JOIN
(SELECT DISTINCT t2.id
FROM table2 t2
WHERE t2.name = 'aaa'
LIMIT 4
) t2
USING (id);
另一种有趣的方式是使用LIMIT
:
SELECT t1.*
FROM table1 t1
WHERE id <= ANY (SELECT t2.id
FROM table2
WHERE t2.name = 'aaa'
ORDER BY t2.id
LIMIT 1 OFFSET 3
);
LIMIT
是在标量子查询中允许的。
【讨论】:
坦克SELECT t1.* FROM table1 t1 JOIN (SELECT DISTINCT t2.id FROM table2 t2 WHERE t2.name = 'aaa' LIMIT 4 ) t2 USING (id);
工作【参考方案2】:
您可以使用ROW_NUMBER()
等分析函数从子查询中返回一行。我想,这种方式不会像引发太多行问题那样出现问题:
SELECT * FROM
(
SELECT t1.*,
ROW_NUMBER() OVER (ORDER BY t2.id DESC) AS rn
FROM table1 t1
JOIN table2 t2 ON t2.id = t1.id
WHERE t2.name ='aaa'
) t
WHERE rn = 1
P.S.:顺便说一句,id 列应该是表的主键,不是吗?
更新(取决于您在评论中的需要)考虑使用:
SELECT * FROM
(
SELECT j.*,
ROW_NUMBER() OVER (ORDER BY j.id DESC) AS rn2
FROM job_forum j
CROSS JOIN
( SELECT t.*,
ROW_NUMBER() OVER (PARTITION BY t2.id ORDER BY t2.id DESC) AS rn1
FROM table2 t2
WHERE t2.name ='aaa'
AND t2.id = j.id ) t2
WHERE rn1 = 1
) jj
WHERE rn2 <= 10
【讨论】:
SELECT * FROM table1 WHERE id in ( SELECT id FROM table2 WHERE id>(SELECT MAX(id) FROM table2 )-11 and id<(SELECT MAX(id) FROM table2 )-0 )
这是我需要的,但它使用了另外两个选择
坦克你的回答是对的,但是那天我很生气很累,今天我测试了一下以上是关于where column in from another select results with limit (mysql/mariadb)的主要内容,如果未能解决你的问题,请参考以下文章
Select into Table from Table2 where column in (Subquer)
where column in from another select results with limit (mysql/mariadb)
sh 来自https://stackoverflow.com/questions/23222616/copy-all-keys-from-one-db-to-another-in-redis
Error: ER_BAD_FIELD_ERROR: Unknown column 'xxx' in 'where clause'
MySQLjava.sql.SQLException:Unknown column ‘****‘ in ‘where clause‘错误问题原因以及如何解决?