0

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

4

2 回答 2

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 在标量子查询中是允许的。

于 2019-12-29T13:39:50.960 回答
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

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
于 2019-12-29T12:10:58.980 回答