MySQL - Diese Version von MySQL unterstützt die Unterabfrage 'LIMIT & IN / ALL / ANY / SOME' noch nicht

87

Dies ist der Code, den ich benutze

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

Das ist der Fehler, der mir gibt

 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

Wie kann ich dieses Problem beheben? seine andere Art, es zu machen ... also bekomme ich den Fehler nicht ...

Mihai Viteazu
quelle
wie ich das beheben kann lol ... oder wie ich es zum
Mihai Viteazu
Verwenden Sie eine Version von MySQL, die dies unterstützt?
Paul Dessert
Können Sie bitte den gesamten Code angeben? Wie wird zum Beispiel $ db gesetzt?
Bestprogrammerintheworld
5.1.59 Dies ist die Version, die ich benutze
Mihai Viteazu
3
Immer noch der Fall mit 5.7.11
Gamov

Antworten:

155

Anstelle von IN können Sie JOIN verwenden

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
Mike Brant
quelle
Ich versuche diesen Code und funktioniert perfekt ... so verwende ich ihn $ 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) als v2 ON v.VID = v2.VID ORDER BY RAND () LIMIT 1 '); foreach ($ Last_Video als $ Video) {$ Array = array ("VID" => $ Video ['VID'], "Thumb" => $ Video ['thumb'], "Total_Videos2" => $ Total_Videos ['num '], "Last_Update_Data" => time ());
Mihai Viteazu
Parameter sollten verwendet werden, um SQL-Injection zu vermeiden
Benoit Duffez
123

Sie können unten verwenden, um diesen Fehler zu umgehen.

$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
');
Surender
quelle
8
Ich bin mir nicht sicher, warum die DB-Engine so etwas nicht aufnehmen kann, ohne dass eine Unterabfrage in eine Unterabfrage eingeschlossen werden muss - was einfach nur dumm erscheint. aber hey, das funktioniert so danke.
Billynoah
1
Ich stimme Rabih Kodeih zu, diese Antwort braucht mehr Stimmen. Dieser Weg funktioniert auch mit UPDATE / DELETE, das ist großartig! :) +1
Charles Cavalcante
5
Leider funktioniert dies nicht, wenn Sie versuchen, die äußere Select-Anweisungsspalte aus dem inneren Select-Stament zu referenzieren. Beispiel: 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
Lief wie am Schnürchen! Ich frage mich jedoch, ob dies in Bezug auf die Leistung besser wäre oder ob die INNER JOIN-Anweisung als Antwort markiert ist.
Dash
6

Sie brauchen hier keine Unterabfrage. Versuche dies:

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

In MySQL 5.0.26 und höher wird folgende Fehlermeldung angezeigt:

MySQL unterstützt LIMIT in Unterabfragen für bestimmte Unterabfrageoperatoren nicht:

Referenz .

echo_Me
quelle
2
Dies entspricht nicht dem ursprünglichen Ziel, einen Datensatz zufällig für die 5 von der Unterabfrage zurückgegebenen auszuwählen.
Mike Brant
Die Bearbeitung unterstützt immer noch nicht die Möglichkeit, die zufällige Auswahl auf nur die Datensätze mit 5 höchsten Werten fürviewtime
Mike Brant
0

Fügen Sie hinzu, dies ist Ihr Zustand

(SELECT * FROM (
    SELECT * FROM table ORDER BY id DESC LIMIT 50
) sub
ORDER BY id ASC)
Vasim Walikar
quelle
-1

Warum können Sie nicht einfach verwenden :?

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

Was ist mit Unterabfragen hier?

Vladimir Krasnobaev
quelle
3
Weil es einen Fehler gibt und deshalb ein Beitrag hier ist .. :-P
Sayka
Weil Ihre Anfrage nicht das erreicht, was er versucht zu tun.
Jeff Ryan