MySQL - Esta versão do MySQL ainda não oferece suporte à subconsulta 'LIMIT & IN / ALL / ANY / SOME

96

este é o código que estou 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
');

Esse é o erro que me deu

 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

como posso resolver esse problema? é outra maneira de fazer isso ... então eu não entendo o erro ...

Mihai Viteazu
fonte
como posso consertar isso lol ... ou como posso fazer funcionar ...
Mihai Viteazu
Use uma versão do MySQL que suporte isso?
Paul Dessert
Você pode fornecer o código completo. Como $ db é definido, por exemplo?
bestprogrammerintheworld
5.1.59 esta é a versão que eu uso
Mihai Viteazu
3
Ainda é o caso com 5.7.11
gamov

Respostas:

162

Em vez de usar IN, você pode 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
fonte
eu tento este código e funciona perfeitamente ... é assim que eu 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
parâmetros devem ser usados ​​para evitar injeção de SQL
Benoit Duffez
132

Você pode usar a seguir para contornar este erro.

$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
fonte
10
não sei por que o mecanismo de banco de dados não pode acomodar algo assim sem a necessidade de envolver uma subconsulta em uma subconsulta - o que parece estúpido. mas hey, isso funciona muito obrigado.
billynoah
3
Eu concordo com Rabih Kodeih, esta resposta precisa de mais votos. Desta forma funciona com UPDATE / DELETE também, isso é ótimo! :) +1
Charles Cavalcante
5
Infelizmente, isso não funcionará se você estiver tentando fazer referência à coluna de instrução de seleção externa a partir do status de seleção interno. Exemplo: 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
Funcionou como um encanto! No entanto, eu me pergunto em termos de desempenho, este seria melhor ou a instrução INNER JOIN marcada como resposta.
Dash
5

Você não precisa de uma subconsulta aqui. Experimente isto:

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

No MySQL 5.0.26 e posterior, você obterá um erro:

O MySQL não oferece suporte a LIMIT em subconsultas para determinados operadores de subconsultas:

Referência .

echo_Me
fonte
3
Isso não atende ao objetivo original de selecionar um registro aleatoriamente para os 5 retornados da subconsulta.
Mike Brant
1
A edição ainda não suporta a capacidade de limitar a seleção aleatória apenas aos registros com 5 valores mais altos paraviewtime
Mike Brant
0

Por que você não pode usar o simples:?

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

para quê subconsultas aqui?

Vladimir Krasnobaev
fonte
4
Porque há um erro, e é por isso que um post está aqui .. :-P
Sayka
Porque sua consulta não realiza o que ele está tentando fazer.
Jeff Ryan
0

adicione esta é sua condição

(SELECT * FROM (
    SELECT * FROM table ORDER BY id DESC LIMIT 50
) sub
ORDER BY id ASC)
Vasim Walikar
fonte
Por que, o que você ganha com isso?
Sebastian Palma,