MySQL: questa versione di MySQL non supporta ancora la sottoquery 'LIMIT & IN / ALL / ANY / A


95

questo è il codice che sto usando

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

Questo è l'errore che mi dai

 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

come posso risolvere questo problema? è un altro modo per farlo ... quindi non ottengo l'errore ...


come posso risolvere questo lol ... o come posso farlo funzionare ...
Mihai Viteazu

Utilizzi una versione di MySQL che lo supporti?
Paul Dessert

Puoi fornire l'intero codice. Come viene impostato $ db, ad esempio?
bestprogrammerintheworld

5.1.59 questa è la versione che uso
Mihai Viteazu

3
Ancora il caso con 5.7.11
gamov

Risposte:


162

Invece di usare IN, puoi usare 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

provo questo codice e funziona perfettamente ... questo è il modo in cui lo uso $ 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

i parametri dovrebbero essere usati per evitare l'iniezione di SQL
Benoit Duffez

131

È possibile utilizzare di seguito per aggirare questo errore.

$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
Non sono sicuro del motivo per cui il motore db non può ospitare qualcosa di simile senza la necessità di racchiudere una sottoquery in una sottoquery, il che sembra stupido. ma hey, funziona quindi grazie.
billynoah

3
Sono d'accordo con Rabih Kodeih, questa risposta necessita di più voti. In questo modo funziona anche con UPDATE / DELETE, è fantastico! :) +1
Charles Cavalcante

5
Sfortunatamente questo non funzionerà se stai cercando di fare riferimento alla colonna dell'istruzione di selezione esterna dallo stamento di selezione interno. Esempio: 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

Ha funzionato come un fascino! Tuttavia, mi chiedo in termini di prestazioni, questo sarebbe migliore o la dichiarazione INNER JOIN contrassegnata come risposta.
Dash

5

Non hai bisogno di una sottoquery qui. Prova questo:

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

In MySQL 5.0.26 e versioni successive, riceverai un errore:

MySQL non supporta LIMIT nelle sottoquery per alcuni operatori di sottoquery:

Riferimento .


3
Ciò non soddisfa l'obiettivo originale di selezionare un record a caso per i 5 restituiti dalla sottoquery.
Mike Brant

1
La modifica non supporta ancora la possibilità di limitare la selezione casuale solo a quei record con i 5 valori più alti perviewtime
Mike Brant,

0

aggiungi questa è la tua condizione

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

Perché, cosa ottieni con questo?
Sebastian Palma,

-1

Perché non puoi usare semplice:?

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

che cosa per le sottoquery qui?


3
Perché c'è un errore, ed è per questo che c'è un post .. :-P
Sayka

Perché la tua query non realizza ciò che sta cercando di fare.
Jeff Ryan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.