MySQL - 此版本的 MySQL 尚不支持 'LIMIT & IN/ALL/ANY/SOME 子查询

Posted

技术标签:

【中文标题】MySQL - 此版本的 MySQL 尚不支持 \'LIMIT & IN/ALL/ANY/SOME 子查询【英文标题】:MySQL - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subqueryMySQL - 此版本的 MySQL 尚不支持 'LIMIT & IN/ALL/ANY/SOME 子查询 【发布时间】:2013-07-27 09:31:34 【问题描述】:

这是我使用的代码

    $Last_Video         = $db->fetch_all('
    SELECT VID, thumb
    FROM video
    WHERE VID IN (
        SELECT VID
        FROM video
        WHERE title LIKE "%'.$Channel['name'].'%"
        ORDER BY viewtime DESC
        LIMIT 5)
    ORDER BY RAND()
    LIMIT 1
');

这是给我的错误

 Message:   Error during SQL execution: SELECT VID, thumb FROM video WHERE VID IN ( SELECT VID FROM video WHERE title LIKE "%funny%" ORDER BY viewtime DESC LIMIT 5) ORDER BY RAND() LIMIT 1<br />
 mysql Error:   This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'<br />
MySQL Errno:    1235

我该如何解决这个问题?它的另一种方法......所以我没有得到错误......

【问题讨论】:

我该如何解决这个问题……或者我如何使它工作…… 使用支持它的 MySQL 版本? 能否提供完整的代码。比如$db是怎么设置的? 5.1.59 这是我用的版本 5.7.11 还是这样 【参考方案1】:

mysql 被禁用读取 ORACLE

DELETE FROM wall_orders WHERE order_id IN ( SELECT order_id FROM (SELECT order_id, COUNT(orders_products_id) as cnt FROM wall_orders_products GROUP BY order_id ORDER BY cnt DESC LIMIT 1000) y1 WHERE cnt > 170 LIMIT 1000)

235 - 此版本的 MariaDB 尚不支持“LIMIT & IN/ALL/ANY/SOME 子查询”

简单的 SQL 是不可能的

【讨论】:

【参考方案2】:

添加这是你的状况

(SELECT * FROM (
    SELECT * FROM table ORDER BY id DESC LIMIT 50
) sub
ORDER BY id ASC)

【讨论】:

为什么,你得到了什么? 显然 db 引擎无法处理子查询中的限制,但可以处理子查询中的子查询。现在我们不仅要处理sql注入,还要处理sql inception...【参考方案3】:

您可以使用下面的方法绕过此错误。

$Last_Video = $db->fetch_all('
    SELECT VID, thumb
    FROM video
    WHERE VID IN (select * from (
        SELECT VID
        FROM video
        WHERE title LIKE "%'.$Channel['name'].'%"
        ORDER BY viewtime DESC
        LIMIT 5) temp_tab)
    ORDER BY RAND()
    LIMIT 1
');

【讨论】:

不确定为什么 db 引擎不能在不需要在子查询中包装子查询的情况下适应这样的事情——这看起来很愚蠢。但是,嘿,这很有效,谢谢。 我同意 Rabih Kodeih,这个答案需要更多的选票。这种方式也适用于 UPDATE/DELETE,这很棒! :) +1 不幸的是,如果您尝试从内部选择语句引用外部选择语句列,这将不起作用。示例:select p1.categoryid, p1.productid from products p1 WHERE p1.productid IN (select * from (select p2.productid from products p2 WHERE p2.categoryid=p1.categoryid order by p2.categoryid asc, p2.unitprice desc limit 3) as tabelka); 工作就像一个魅力!但是我想知道性能方面,这个更好还是将 INNER JOIN 语句标记为答案。 2021 并且仍在工作。我正在寻找一种解决方案来选择表中除最后 N 条记录之外的所有记录。这样做了【参考方案4】:

这里不需要子查询。试试这个:

 SELECT VID, thumb
 FROM video
 WHERE title LIKE "%'.$Channel['name'].'%"
 ORDER BY RAND() DESC
 LIMIT 1

在 MySQL 5.0.26 及更高版本中,你会得到一个错误:

对于某些子查询运算符,MySQL 不支持子查询中的 LIMIT:

Reference.

【讨论】:

这不符合最初的目标,即子查询返回的5条随机选择一条记录。 编辑仍然不支持将随机选择限制为仅具有 5 个最高值 viewtime 的记录的功能【参考方案5】:

为什么你不能使用简单:?

SELECT v.VID, v.thumb
FROM video as v
WHERE title LIKE "%'.$Channel['name'].'%"
ORDER BY viewtime DESC
LIMIT 5

这里的子查询是什么?

【讨论】:

因为有一个错误,这就是为什么一个帖子在这里.. :-P 因为你的查询没有完成他想要做的事情。【参考方案6】:

你可以使用JOIN来代替IN

SELECT v.VID, v.thumb
FROM video AS v
INNER JOIN
     (SELECT VID
     FROM video
     WHERE title LIKE "%'.$Channel['name'].'%"
     ORDER BY viewtime DESC
     LIMIT 5) as v2
  ON v.VID = v2.VID
ORDER BY RAND()
LIMIT 1

【讨论】:

我尝试了这段代码并且效果很好......这就是我使用它的方式 $Last_Video = $db->fetch_all('SELECT v.VID, v.thumb FROM video AS v INNER JOIN (SELECT VID FROM video WHERE title LIKE "%'.$Channel['name'].'%" ORDER BY viewtime DESC LIMIT 5) as v2 ON v.VID = v2.VID ORDER BY RAND() LIMIT 1'); foreach($Last_Video as $Video) $Array = array( "VID" => $Video['VID'], "Thumb" => $Video['thumb'], "Total_Videos2" => $Total_Videos['num '], "Last_Update_Data" => time() ); 参数应该用来避免SQL注入

以上是关于MySQL - 此版本的 MySQL 尚不支持 'LIMIT & IN/ALL/ANY/SOME 子查询的主要内容,如果未能解决你的问题,请参考以下文章

OGG18.1次新特性之对MariaDB集成

MySQL 简介

[Amazon](500310) 无效操作:尚不支持此类IN/NOT IN查询;

5分钟了解MariaDB创建角色功能

PHPWAMP快速自定义Mysql历史版本,吸纳其他集成环境的Mysql数据库

MySQL内置全文检索