where另一个选择中的列的结果有限制(mysql / mariadb)

时间:2019-12-29 11:41:38

标签: sql mariadb mariadb-10.3

当我运行此查询时,返回其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子查询”

2 个答案:

答案 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