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 -- 幸运的是。如果idtable2中没有重复:

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&gt;(SELECT MAX(id) FROM table2 )-11 and id&lt;(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

mysql IN()和LIKE在一起

Error: ER_BAD_FIELD_ERROR: Unknown column 'xxx' in 'where clause'

MySQLjava.sql.SQLException:Unknown column ‘****‘ in ‘where clause‘错误问题原因以及如何解决?