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.