MySQL - ta wersja MySQL nie obsługuje jeszcze podzapytania „LIMIT & IN / ALL / ANY / SOME”


96

to jest kod, którego używam

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

To jest błąd, który mi daje

 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

jak mogę rozwiązać ten problem? to inny sposób na zrobienie tego ... więc nie dostaję błędu ...


jak mogę to naprawić lol ... albo jak sprawić, żeby działało ...
— Mihai Viteazu

Użyć wersji MySQL, która to obsługuje?
— Paul Dessert

Czy możesz podać cały kod. Na przykład jak ustawia się $ db?
— bestprogrammerintheworld

5.1.59 to jest wersja, której używam
— Mihai Viteazu

3
Nadal sprawa z 5.7.11
— gamov

Odpowiedzi:


163

Zamiast używać IN, możesz użyć 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

próbuję tego kodu i działa idealnie ... tak go używam $ Last_Video = $ db-> fetch_all ('SELECT v.VID, v.thumb FROM video AS v INNER JOIN (SELECT VID FROM video WHERE title LIKE "% '. $ Kanał [' nazwa '].'%" ZAMÓWIENIE WEDŁUG czasu oglądania DESC LIMIT 5) jako 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

należy używać parametrów, aby uniknąć iniekcji SQL
— Benoit Duffez

132

Możesz użyć poniżej, aby ominąć ten błąd.

$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
nie jestem pewien, dlaczego silnik db nie może pomieścić czegoś takiego bez potrzeby zawijania podzapytania w podzapytanie - co po prostu wydaje się głupie. ale hej, to działa, więc dzięki.
— billynoah

3
Zgadzam się z Rabihem Kodeihem, ta odpowiedź wymaga większej liczby głosów. W ten sposób działa również z UPDATE / DELETE, to jest świetne! :) +1
— Charles Cavalcante

5
Niestety to nie zadziała, jeśli próbujesz odwołać się do zewnętrznej kolumny instrukcji select z wewnętrznego stamentu select. Przykład: 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

Działał jak urok! Jednak zastanawiam się pod względem wydajności, czy ta byłaby lepsza, czy też instrukcja INNER JOIN oznaczona jako odpowiedź.
— Dash

5

Nie potrzebujesz tutaj podzapytania. Spróbuj tego:

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

W MySQL 5.0.26 i nowszych wersjach pojawi się błąd:

MySQL nie obsługuje LIMIT w podzapytaniach dla niektórych operatorów podzapytań:

Odniesienie .


3
Nie spełnia to pierwotnego celu polegającego na losowym wybraniu jednego rekordu z 5 zwróconych z podzapytania.
— Mike Brant

1
Edycja nadal nie obsługuje możliwości ograniczenia losowego wyboru tylko do tych rekordów z 5 najwyższymi wartościami dlaviewtime
— Mike Brant.

0

Dlaczego nie możesz użyć prostego:?

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

co z podzapytaniami tutaj?


4
Ponieważ jest błąd i dlatego post jest tutaj .. :-P
— Sayka

Ponieważ twoje zapytanie nie spełnia tego, co on próbuje zrobić.
— Jeff Ryan,

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.