其中列从另一个选择结果与限制 (Mysql/mariadb)



当我运行此查询时,返回其 id 存在于 表2 中选择的所有行

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 子查询">

您正在使用没有ORDER BYLIMIT。 通常不建议这样做,因为这会返回任意一组行 - 并且这些行可以从一个执行更改为另一个执行。

你可以把它转换成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

您可以使用分析函数(如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

PS:顺便说一句,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

最新更新