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


95

这是我正在使用的代码

    $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

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


我如何解决这个问题……或如何使其工作……
Mihai Viteazu

使用支持它的MySQL版本?
Paul Dessert

您能提供完整的代码吗?例如如何设置$ db?
bestprogrammerintheworld,

5.1.59这是我使用的版本
Mihai Viteazu

3
5.7.11仍然如此
gamov '16

Answers:


162

除了使用IN,还可以使用JOIN

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']。'%”按观看时间排序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());
Mihai Viteazu

参数应用于避免SQL注入
Benoit Duffez

130

您可以在下面使用它来绕过此错误。

$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
');

9
不知道为什么db引擎不需要在子查询中包装子查询就不能容纳这样的东西-这看起来很愚蠢。但是,这很有效,谢谢。
billynoah's

3
我同意拉比·科迪(Rabih Kodeih)的观点,此答案需要更多票。这种方式也适用于UPDATE / DELETE,这很棒!:) +1
Charles Cavalcante

5
不幸的是,如果您尝试从内部选择语句中引用外部选择语句列,则此方法将行不通。示例: 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);
Tomasz Mularczyk

像魅力一样工作!但是我不知道性能是否明智,这会更好还是将INNER JOIN语句标记为答案。
Dash

5

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

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

在MySQL 5.0.26和更高版本中,您将得到一个错误:

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

参考


3
这不符合为子查询返回的5条记录随机选择一条记录的最初目标。
Mike Brant

1
该编辑仍不支持将随机选择限制为仅具有最高5个值的记录的能力viewtime
Mike Brant


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.