MySQL - Versi MySQL ini belum mendukung subkueri 'LIMIT & IN / ALL / ANY / SOME


95

ini adalah kode yang saya gunakan

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

Ini adalah kesalahan yang saya berikan

 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

bagaimana saya bisa memperbaiki masalah ini? cara lain untuk membuatnya ... jadi saya tidak mendapatkan kesalahan ...


bagaimana saya bisa memperbaikinya lol ... atau bagaimana saya bisa membuatnya bekerja ...
Mihai Viteazu

Gunakan versi MySQL yang mendukungnya?
Paul Dessert

Bisakah Anda memberikan seluruh kode. Bagaimana $ db disetel misalnya?
bestprogrammerintheworld

5.1.59 ini adalah versi yang saya gunakan
Mihai Viteazu

3
Masih kasus dengan 5.7.11
gamov

Jawaban:


162

Alih-alih menggunakan IN, Anda dapat menggunakan GABUNG

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

saya mencoba kode ini dan bekerja dengan sempurna ... ini adalah cara saya menggunakannya $ 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) sebagai v2 ON v.VID = v2.VID ORDER BY RAND () LIMIT 1 '); foreach ($ Last_Video sebagai $ Video) {$ Array = array ("VID" => $ Video ['VID'], "Thumb" => $ Video ['thumb'], "Total_Videos2" => $ Total_Videos ['num '], "Last_Update_Data" => waktu ());
Mihai Viteazu

parameter harus digunakan untuk menghindari injeksi SQL
Benoit Duffez

131

Anda dapat menggunakan di bawah ini untuk melewati kesalahan ini.

$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
tidak yakin mengapa mesin db tidak dapat mengakomodasi sesuatu seperti ini tanpa perlu membungkus subquery dalam subquery - yang sepertinya bodoh. tapi hei, ini berhasil jadi terima kasih.
billynoah

3
Saya setuju dengan Rabih Kodeih, jawaban ini butuh lebih banyak suara. Cara ini juga berfungsi dengan UPDATE / DELETE, ini bagus! :) +1
Charles Cavalcante

5
Sayangnya ini tidak akan berhasil jika Anda mencoba untuk mereferensikan kolom pernyataan pilih luar dari kalimat pilihan dalam. Contoh: 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

Bekerja seperti pesona! Bagaimanapun saya bertanya-tanya dalam hal kinerja, apakah yang ini lebih baik atau pernyataan INNER JOIN ditandai sebagai jawaban.
Dash

5

Anda tidak membutuhkan subkueri di sini. Coba ini:

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

Di MySQL 5.0.26 dan yang lebih baru, Anda akan mendapatkan error:

MySQL tidak mendukung LIMIT di subquery untuk operator subquery tertentu:

Referensi .


3
Itu tidak memenuhi tujuan awal memilih satu catatan secara acak untuk 5 yang dikembalikan dari subkueri.
Mike Brant

1
Pengeditan masih tidak mendukung kemampuan untuk membatasi pemilihan acak hanya untuk catatan dengan 5 nilai tertinggi untukviewtime
Mike Brant

0

tambahkan ini adalah kondisi Anda

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

Kenapa, apa yang kamu dapatkan dengan ini?
Sebastian Palma

-1

Mengapa Anda tidak dapat menggunakan sederhana:?

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

untuk apa subkueri di sini?


3
Karena ada error, dan itulah mengapa ada postingan di sini .. :-P
Sayka

Karena kueri Anda tidak mencapai apa yang dia coba lakukan.
Jeff Ryan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.