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

як я можу вирішити цю проблему? його інший спосіб зробити це ... так що я не отримую помилку ...


як я можу це виправити хаха ... або як я можу змусити це працювати ...
Mihai Viteazu

Використовувати версію MySQL, яка її підтримує?
Paul Dessert

Чи можете ви надати цілий код? Як встановлено, наприклад, $ db?
кращийпрограміст усвіті

5.1.59 це версія, якою я користуюся
Mihai Viteazu

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 '].'%" ЗАМОВИТИ ПО ОГЛЯДУ часу перегляду DESC 5) як v2 ON v.VID = v2.VID ORDER BY RAND () LIMIT 1 '); foreach ($ Last_Video як $ Video) {$ Array = array ("VID" => $ Video ['VID'], "Thumb" => $ Video ['thumb'], "Total_Videos2" => $ Total_Videos ['num '], "Last_Update_Data" => час ());
Mihai Viteazu,

параметри слід використовувати, щоб уникнути ін'єкції SQL
Бенуа Даффес

130

Ви можете використовувати нижче, щоб обійти цю помилку.

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

9
не впевнений, чому движок db не може вмістити щось подібне без необхідності обертати підзапит у підзапит - що просто здається дурним. але привіт, це працює так дякую.
billynoah

3
Я згоден з Рабіхом Кодейхом, за цю відповідь потрібно більше голосів. Цей спосіб також працює з UPDATE / DELETE, це чудово! :) +1
Шарль Кавальканте

5
На жаль, це не спрацює, якщо ви намагаєтеся посилатися на зовнішній стовпець оператора select із внутрішнього statem select. Приклад: 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);
Томаш Муларчик

Працював як оберіг! Однак мені цікаво, чи буде цей показник кращим, чи це буде заява INNER JOIN, позначена як відповідь.
Тире

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
Mike Brant


-1

Чому ви не можете використовувати прості:?

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

що тут за підзапити?


3
Тому що є помилка, і тому тут є повідомлення .. :-P
Сайка

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