MySQL: esta versión de MySQL aún no admite la subconsulta 'LIMIT & IN / ALL / ANY / SOME

95

este es el código que estoy 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
');

Este es el error que me da

 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

¿Cómo puedo solucionar este problema? es otra forma de hacerlo ... así que no obtengo el error ...

Mihai Viteazu
fuente
cómo puedo arreglar esto jajaja ... o cómo puedo hacer que funcione ...
Mihai Viteazu
¿Utiliza una versión de MySQL que lo admita?
Paul Dessert
¿Puede proporcionar el código completo? ¿Cómo se establece $ db, por ejemplo?
bestprogrammerintheworld
5.1.59 esta es la versión que uso
Mihai Viteazu
3
Sigue siendo el caso con 5.7.11
gamov

Respuestas:

162

En lugar de usar IN, puede usar 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
Mike Brant
fuente
pruebo este código y funciona perfecto ... así es como 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" => hora ());
Mihai Viteazu
los parámetros deben usarse para evitar la inyección de SQL
Benoit Duffez
131

Puede utilizar a continuación para evitar este error.

$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
fuente
10
No estoy seguro de por qué el motor de db no puede acomodar algo como esto sin la necesidad de envolver una subconsulta en una subconsulta, lo cual parece estúpido. pero bueno, esto funciona así que gracias.
Billynoah
3
Estoy de acuerdo con Rabih Kodeih, esta respuesta necesita más votos. De esta manera también funciona con UPDATE / DELETE, ¡esto es genial! :) +1
Charles Cavalcante
5
Desafortunadamente, esto no funcionará si está intentando hacer referencia a la columna de instrucción de selección externa desde la instrucción de selección interna. Ejemplo: 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
¡Trabajado como un encanto! Sin embargo, me pregunto en cuanto al rendimiento, ¿sería mejor este o la declaración INNER JOIN marcada como respuesta?
Dash
5

No necesitas una subconsulta aquí. Prueba esto:

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

En MySQL 5.0.26 y posteriores, obtendrá un error:

MySQL no admite LIMIT en subconsultas para ciertos operadores de subconsultas:

Referencia .

echo_Me
fuente
3
Eso no cumple con el objetivo original de seleccionar un registro al azar para los 5 devueltos por la subconsulta.
Mike Brant
1
La edición aún no admite la capacidad de limitar la selección aleatoria solo a aquellos registros con 5 valores más altos paraviewtime
Mike Brant
0

agrega que esta es tu condición

(SELECT * FROM (
    SELECT * FROM table ORDER BY id DESC LIMIT 50
) sub
ORDER BY id ASC)
Vasim Walikar
fuente
¿Por qué, qué obtienes con esto?
Sebastian Palma
-1

¿Por qué no puedes usar simple:?

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

¿Qué pasa con las subconsultas aquí?

Vladimir Krasnobaev
fuente
3
Porque hay un error, y es por eso que una publicación está aquí ..
:-P
Porque su consulta no logra lo que está tratando de hacer.
Jeff Ryan