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

この問題を解決するにはどうすればよいですか?それを作る他の方法...だから私はエラーを受け取らない...


...私はこの笑を修正することができますどのように...または私はそれが動作することができますか
ミハイViteazu

それをサポートするMySQLのバージョンを使用しますか?
ポールデザート2013

コード全体を提供していただけませんか。たとえば、$ dbはどのように設定されますか?
bestprogrammerintheworld 2013

5.1.59これは私が使用しているバージョンです
Mihai Viteazu 2013

3
まだ5.7.11の場合
gamov

回答:


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 ']。'%" 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());
Mihai Viteazu 2013

SQLインジェクションを回避するためにパラメータを使用する必要があります
BenoitDuffez19年

131

以下を使用して、このエラーを回避できます。

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

10
サブクエリをサブクエリでラップする必要なしにdbエンジンがこのようなものに対応できない理由はわかりません-これはばかげているようです。しかしねえ、これはとても感謝しています。
ビリノア2016年

3
私はRabihKodeihに同意します、この答えはもっと投票が必要です。この方法はUPDATE / DELETEでも機能します。これは素晴らしいことです!:) +1
Charles Cavalcante 2016

5
残念ながら、これは、内側のselect文から外側のselectステートメント列を参照しようとしている場合は機能しません。例: 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 2016

チャームのように働いた!ただし、パフォーマンスに関しては、これの方が優れているのでしょうか、それともINNERJOINステートメントが回答としてマークされているのでしょうか。
ダッシュ

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つのレコードに対してランダムに1つのレコードを選択するという当初の目標を満たしていません。
Mike Brant 2013

1
編集では、ランダム選択を5つの最高値を持つレコードのみに制限する機能はまだサポートされていませんviewtime
Mike Brant

0

これがあなたの状態であることを追加します

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

なぜ、これで何が得られるのですか?
セバスチャンパルマ

-1

単純に使用できない理由:?

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

ここでのサブクエリはどうですか?


3
:-P ..ポストがここにいる理由がエラーがある、とのthatsので
Sayka

あなたのクエリは彼がやろうとしていることを達成しないからです。
ジェフライアン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.