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

Mihai Viteazu
źródło
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
Mike Brant
źródło
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
');
Surender
źródło
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 .

echo_Me
źródło
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?

Vladimir Krasnobaev
źródło
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,
0

dodaj, że jest w twoim stanie

(SELECT * FROM (
    SELECT * FROM table ORDER BY id DESC LIMIT 50
) sub
ORDER BY id ASC)
Vasim Walikar
źródło
Dlaczego, co z tego masz?
Sebastian Palma,