MySQL - Phiên bản MySQL này chưa hỗ trợ 'LIMIT & IN / ALL / ANY / SOME truy vấn con


95

đây là mã những gì tôi đang sử dụng

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

Đây là lỗi những gì cho tôi

 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

làm thế nào tôi có thể khắc phục sự cố này? cách khác để làm cho nó ... vì vậy tôi không gặp lỗi ...


làm thế nào tôi có thể sửa chữa lol này ... hoặc làm thế nào tôi có thể làm cho nó làm việc ...
Mihai Viteazu

Sử dụng phiên bản MySQL hỗ trợ nó?
Paul Dessert vào

Bạn có thể vui lòng cung cấp toàn bộ mã. Ví dụ: $ db được đặt như thế nào?
bestprogrammerintheworld

5.1.59 này là phiên bản gì tôi sử dụng
Mihai Viteazu

3
Vẫn là trường hợp với 5.7.11
gamov

Câu trả lời:


162

Thay vì sử dụng IN, bạn có thể sử dụng 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

tôi thử mã này và hoạt động hoàn hảo ... đây là cách tôi sử dụng nó $ Last_Video = $ db-> fetch_all ('CHỌN v.VID, v.thumb TỪ video AS v INNER JOIN (CHỌN VIDEO TỪ video TẠI ĐÂU tiêu đề THÍCH "% '. $ Channel [' name '].'%" ORDER BY viewtime DESC LIMIT 5) as v2 ON v.VID = v2.VID ORDER BY RAND () LIMIT 1 '); foreach ($ Last_Video dưới dạng $ Video) {$ Array = array ("VID" => $ Video ['VID'], "Thumb" => $ Video ['thumb'], "Total_Videos2" => $ Total_Videos ['num '], "Last_Update_Data" => time ());
Mihai Viteazu,

thông số nên được sử dụng để tránh SQL injection
Benoit Duffez

131

Bạn có thể sử dụng bên dưới để bỏ qua lỗi này.

$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
không chắc tại sao công cụ db không thể chứa một cái gì đó như thế này mà không cần phải bọc một truy vấn con trong một truy vấn con - điều này có vẻ ngu ngốc. nhưng hey, điều này hoạt động vì vậy cảm ơn.
billynoah

3
Tôi đồng ý với Rabih Kodeih, câu trả lời này cần thêm phiếu bầu. Cách này cũng hoạt động với UPDATE / DELETE, điều này thật tuyệt! :) +1
Charles Cavalcante

5
Thật không may, điều này sẽ không hoạt động nếu bạn đang cố gắng tham chiếu cột câu lệnh chọn bên ngoài từ vị trí chọn bên trong. Ví dụ: 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 28/09/16

Làm việc như người ở! Tuy nhiên, tôi tự hỏi hiệu suất khôn ngoan, cái này sẽ tốt hơn hay câu lệnh INNER JOIN được đánh dấu là câu trả lời.
Dash

5

Bạn không cần một truy vấn con ở đây. Thử đi:

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

Trong MySQL 5.0.26 trở lên, bạn sẽ gặp lỗi:

MySQL không hỗ trợ LIMIT trong các truy vấn con đối với các toán tử truy vấn con nhất định:

Tham khảo .


3
Điều đó không đáp ứng mục tiêu ban đầu là chọn ngẫu nhiên một bản ghi cho 5 bản ghi được trả về từ truy vấn con.
Mike Brant

1
Tóm lược sửa đổi vẫn không hỗ trợ khả năng hạn chế sự lựa chọn ngẫu nhiên để chỉ những hồ sơ với 5 giá trị cao nhất choviewtime
Mike Brant

0

thêm đây là tình trạng của bạn

(SELECT * FROM (
    SELECT * FROM table ORDER BY id DESC LIMIT 50
) sub
ORDER BY id ASC)

Tại sao, bạn nhận được gì với cái này?
Sebastian Palma

-1

Tại sao bạn không thể sử dụng simple:?

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

những gì cho truy vấn phụ ở đây?


3
Bởi vì có một lỗi và đó là lý do tại sao một bài đăng ở đây .. :-P
Sayka

Bởi vì truy vấn của bạn không hoàn thành những gì anh ấy đang cố gắng làm.
Jeff Ryan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.