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 子查询的主要内容,如果未能解决你的问题,请参考以下文章
[Amazon](500310) 无效操作:尚不支持此类IN/NOT IN查询;