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 ...


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

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

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 .


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?


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)

Por que, o que você ganha com isso?
Sebastian Palma,
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.