【问题标题】:The LIMIT clause in MySql doesn't seem to work with an IN() subqueryMySql 中的 LIMIT 子句似乎不适用于 IN() 子查询
【发布时间】:2012-11-05 18:11:50
【问题描述】:

假设,我有如下 SQL 语句。

SELECT country_id, country_name 
FROM country 
WHERE country_id 
IN(SELECT country_id FROM state 
   WHERE LENGTH(state_name)>=5 
   ORDER BY LENGTH(state_name) DESC);

它使用指定的子查询从country 表中获取state 表中对应州名称长度超过5 个或更多字符的所有国家/地区。

我只想检索state表中对应的前5个州在降序排序后长度为5个或更多字符的国家/地区。

在这种情况下,带有子查询的LIMIT 子句似乎不起作用,以下查询也不起作用。

SELECT country_id, country_name 
FROM country 
WHERE country_id 
IN(SELECT country_id FROM state 
  WHERE LENGTH(state_name)>=5 
  ORDER BY LENGTH(state_name) DESC 
  LIMIT 5); 

与子查询一起使用的LIMIT 子句导致如下指定的错误。

这个版本的 MySQL 还不支持 'LIMIT & IN/ALL/ANY/SOME 子查询'

我使用的是 MySql 版本 5.1.48

有没有办法解决这种情况?

【问题讨论】:

  • 第一个查询的子选择中的 order by 没有意义(它对 IN 运算符没有影响)

标签: mysql subquery limit


【解决方案1】:

对于同一个子查询,您需要将 IN() 子句替换为 INNER JOIN。正如错误消息所说,LIMIT 根本不支持 IN() 子查询。

SELECT 
  country.country_id, 
  country.country_name 
FROM
  country
  /* JOIN the main `country` table against a subquery that retrieves the limited country_id set */
  INNER JOIN (
    SELECT country_id 
    FROM state 
    WHERE LENGTH(state_name)>=5 
    ORDER BY LENGTH(state_name) DESC 
    LIMIT 5
  ) subq ON country.country_id = subq.country_id

Here is a demonstration

(是的,我知道加拿大人不称他们为“州”,当然 GBR 也不会)

【讨论】:

  • 我认为 OP 可能只需要从 country 表本身中检索一组国家而不使用 inner join 以便结果集不包含重复的国家,但这似乎与此无关案例。
猜你喜欢
  • 1970-01-01
  • 2014-12-27
  • 2015-04-02
  • 1970-01-01
  • 2015-06-21
  • 2018-05-27
  • 2020-10-13
  • 1970-01-01
  • 2010-10-03
相关资源
最近更新 更多