MySQL - эта версия MySQL еще не поддерживает подзапрос LIMIT & IN / ALL / ANY / SOME


95

это код, который я использую

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

Это ошибка, которая мне дала

 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

как я могу решить эту проблему? другой способ сделать это ... так что я не получаю ошибку ...


как я могу исправить это лол ... или как я могу заставить его работать ...
Михай Витеазу

Используйте версию MySQL, которая его поддерживает?
Paul Dessert

Не могли бы вы предоставить весь код? Как, например, устанавливается $ db?
bestprogrammerintheworld

5.1.59 это версия, которую я использую
Михай Витеазу

3
Все еще дело с 5.7.11
gamov

Ответы:


162

Вместо использования IN вы можете использовать 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

я пробую этот код и отлично работает ... вот как я его использую $ 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) как 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 ['число '], "Last_Update_Data" => время ());
Mihai Viteazu

параметры должны использоваться, чтобы избежать SQL-инъекции
Бенуа Дюффес

131

Вы можете использовать ниже, чтобы обойти эту ошибку.

$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
не уверен, почему движок db не может разместить что-то подобное без необходимости оборачивать подзапрос в подзапрос - что просто кажется глупым. но эй, это работает, так что спасибо.
billynoah

3
Я согласен с Рабихом Кодейхом, для этого ответа нужно больше голосов. Этот способ работает и с UPDATE / DELETE, это здорово! :) +1
Шарль Кавальканте

5
К сожалению, это не сработает, если вы пытаетесь ссылаться на столбец внешнего оператора выбора из внутреннего элемента выбора. Пример: 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

Работал как шарм! Однако мне интересно, с точки зрения производительности, будет ли это лучше, или оператор INNER JOIN помечен как ответ.
Dash

5

Здесь вам не нужен подзапрос. Попробуй это:

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

В MySQL 5.0.26 и более поздних версиях вы получите сообщение об ошибке:

MySQL не поддерживает LIMIT в подзапросах для определенных операторов подзапроса:

Ссылка .


3
Это не соответствует первоначальной цели случайного выбора одной записи из 5, возвращаемых из подзапроса.
Mike Brant

1
Редакция по-прежнему не поддерживает возможность ограничить случайный выбор только теми записями с 5 самыми высокими значениями дляviewtime
Майк Брант


-1

Почему нельзя использовать простой:?

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

зачем тут подзапросы?


3
Потому что есть ошибка, и вот почему здесь пост .. :-P
Sayka

Потому что ваш запрос не выполняет то, что он пытается сделать.
Джефф Райан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.