2013-07-26 17 views
41

questo è il codice di quello che im utilizzandoMySQL - Questa versione di MySQL non supporta ancora 'LIMIT e IN/ALL/ANY/SOME subquery

$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 dà

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? l'altro modo per farlo ... quindi non ottengo l'errore ...

+1

Qual è la domanda? –

+0

come posso risolvere questo lol ... o come posso farlo funzionare ... –

+0

Utilizzare una versione di MySQL che lo supporta? –

risposta

86

Invece di utilizzare IN, è possibile utilizzare 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 
+0

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 (SELEZIONA VID DA 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 da $ Video) { $ Array = array ( "VID" => $ Video [ 'VID'], "Thumb" => $ Video [ 'pollice'], "Total_Videos2" = > $ Total_Videos ['num'], "Last_Update_Data" => time() ); –

4

Qui non hai bisogno di una sottoquery. Prova questo:

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

In MySQL 5.0.26 e successivi, si otterrà un errore:

MySQL does not support LIMIT in subqueries for certain subquery operators:

Reference.

+2

Che non soddisfa l'obiettivo originale di selezionare un record a caso per i 5 restituiti dalla sottoquery. –

+0

La modifica non supporta ancora la possibilità di limitare la selezione casuale solo ai record con 5 valori più alti per 'viewtime' –

0

Perché non puoi utilizzare semplici:?

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

cosa per sottoqueries qui?

+1

Perché c'è un errore, e questo è il motivo per cui un post è qui .. :-P – Sayka

73

È possibile utilizzare sotto per ignorare 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 
'); 
+5

Questa è la buona risposta, hanno bisogno di più voti. –

+5

Questa risposta è la risposta accettata – Stefan

+1

non è sicuro del motivo per cui il motore db non può ospitare qualcosa di simile senza la necessità di avvolgere una sottoquery in una sottoquery - che sembra semplicemente stupida. ma hey, funziona così grazie. – billynoah