MySQL - MySQL'in bu sürümü henüz 'LIMIT & IN / ALL / ANY / SOME alt sorgusunu desteklemiyor


95

bu benim kullandığım kod

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

Bu bana veren hata

 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

bu sorunu nasıl çözebilirim? bunu yapmanın başka bir yolu ... bu yüzden hatayı alamıyorum ...


Bu lol'i nasıl düzeltebilirim ... ya da nasıl çalıştırabilirim ...
— Mihai Viteazu

MySQL'in onu destekleyen bir sürümünü mü kullanıyorsunuz?
— Paul Dessert

Lütfen tüm kodu sağlar mısınız? Örneğin $ db nasıl ayarlanır?
— bestprogrammerintheworld

5.1.59 bu benim kullandığım sürüm
— Mihai Viteazu

3
5.7.11 ile hala durum
— gamov

Yanıtlar:


162

IN kullanmak yerine, JOIN kullanabilirsiniz

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

bu kodu deniyorum ve mükemmel çalışıyor ... bu şekilde kullanıyorum $ Last_Video = $ db-> fetch_all ('SELECT v.VID, v.thumb AS v INNER JOIN (videodan VID SEÇİN başlık GİBİ "% '. $ Kanal [' ad '].'%" Görüntüleme süresi TANIM SINIRINA GÖRE SIRALAMA 5) v.VID = v2.VID RANDA GÖRE SIRALAMA () SINIR 1 '); foreach ($ Video olarak $ Last_Video) {$ Array = array ("VID" => $ Video ['VID'], "Başparmak" => $ Video ['başparmak'], "Total_Videos2" => $ Total_Videos ['num '], "Last_Update_Data" => zaman ());
— Mihai Viteazu

SQL enjeksiyonunu önlemek için parametreler kullanılmalıdır
— Benoit Duffez

131

Bu hatayı atlamak için aşağıyı kullanabilirsiniz.

$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 motorunun bir alt sorguyu bir alt sorguya sarmaya gerek kalmadan neden böyle bir şeyi barındıramayacağından emin değilim - ki bu aptalca görünüyor. ama hey, bu işe yarıyor, teşekkürler.
— billynoah

3
Rabih Kodeih'e katılıyorum, bu cevabın daha fazla oya ihtiyacı var. Bu yol GÜNCELLEME / SİLME ile de çalışır, bu harika! :) +1
— Charles Cavalcante

5
Maalesef, iç seçim stamentinden dış select deyimi sütununa başvurmaya çalışıyorsanız bu işe yaramaz. Örnek: 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

Büyü gibi çalıştı! Bununla birlikte, performans açısından merak ediyorum, bu daha mı iyi olur yoksa INNER JOIN ifadesi yanıt olarak işaretlendi.
— Dash

5

Burada alt sorguya ihtiyacınız yok. Bunu dene:

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

MySQL 5.0.26 ve sonraki sürümlerde bir hata alacaksınız:

MySQL, belirli alt sorgu operatörleri için alt sorgularda LIMIT'i desteklemez:

Referans .


3
Bu, alt sorgudan döndürülen 5 kayıt için rastgele bir kayıt seçme orijinal hedefini karşılamıyor.
— Mike Brant

1
Düzenlemek hala 5 en yüksek değerlere sahip sadece bu kayıtlara rastgele Seçimi sınırlamak için özelliğini desteklemezviewtime
— Mike Brant

0

bu senin durumunda olduğunu ekle

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

Neden, bununla ne elde ediyorsun?
— Sebastian Palma

-1

Neden basit kullanamıyorsunuz:?

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

buradaki alt sorgular için ne var?


3
Çünkü bir hata var ve bu yüzden burada bir gönderi var .. :-P
— Sayka

Çünkü sorgunuz, onun yapmaya çalıştığı şeyi başaramıyor.
— Jeff Ryan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.