MySQL - MySQL เวอร์ชันนี้ยังไม่รองรับ 'LIMIT & IN / ALL / ANY / SOME subquery


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 ตั้งค่าอย่างไร
bestprogrammerintheworld

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 จากวิดีโอเป็น v INNER JOIN (เลือก VID จากวิดีโอที่ชื่อชอบ "% '. $ Channel [' name '].'%" ORDER BY viewtime DESC LIMIT 5) as 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
Benoit Duffez

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 engine ไม่สามารถรองรับบางสิ่งเช่นนี้ได้โดยไม่จำเป็นต้องห่อแบบสอบถามย่อยในแบบสอบถามย่อยซึ่งดูเหมือนจะโง่ แต่เดี๋ยวก่อนงานนี้ขอบคุณมาก
billynoah

3
ฉันเห็นด้วยกับ Rabih Kodeih คำตอบนี้ต้องการคะแนนเสียงมากกว่านี้ วิธีนี้ใช้ได้กับ UPDATE / DELETE ด้วยนี่ยอดเยี่ยมมาก! :) +1
Charles Cavalcante

5
น่าเสียดายที่สิ่งนี้ใช้ไม่ได้หากคุณพยายามอ้างอิงคอลัมน์คำสั่ง select ด้านนอกจากด้านในเลือก stament ตัวอย่าง: 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
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
Sayka

เนื่องจากคำถามของคุณไม่บรรลุผลในสิ่งที่เขาพยายามทำ
Jeff Ryan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.