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 ...

Mihai Viteazu
sumber
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
Mike Brant
sumber
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
');
Menyerah
sumber
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 .

echo_Me
sumber
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)
Vasim Walikar
sumber
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?

Vladimir Krasnobaev
sumber
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