当我运行此查询时,返回其ID存在于table2 select中的所有行
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子查询”
答案 0 :(得分:0)
您可以使用诸如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
答案 1 :(得分:0)
您正在使用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
。