MySQL-이 버전의 MySQL은 아직 'LIMIT & IN / ALL / ANY / SOME 하위 쿼리를 지원하지 않습니다.


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

이 문제를 어떻게 해결할 수 있습니까? 그것을 만드는 다른 방법 ... 그래서 나는 오류가 발생하지 않습니다 ...


나는이 롤을 해결할 수있는 방법 ... 또는 내가 그것을 ... 작업 할 수있는 방법
미하이 Viteazu

지원하는 MySQL 버전을 사용하십니까?
Paul Dessert

전체 코드를 제공해 주시겠습니까? 예를 들어 $ db는 어떻게 설정됩니까?
bestprogrammerintheworld jul

5.1.59이 내가 무엇을 사용 버전입니다
미하이 Viteazu

3
여전히 5.7.11의 경우
gamov 2011

답변:


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 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 '); foreach ($ Last_Video as $ Video) {$ Array = array ( "VID"=> $ Video [ 'VID'], "Thumb"=> $ Video [ 'thumb'], "Total_Videos2"=> $ Total_Videos [ 'num '], "Last_Update_Data"=> time ());
Mihai Viteazu 2013

매개 변수는 SQL 주입을 방지하기 위해 사용되어야한다
벤와 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 엔진이 하위 쿼리에 하위 쿼리를 래핑 할 필요없이 이와 같은 것을 수용 할 수 없는지 확실하지 않습니다. 하지만 이건 정말 감사합니다.
billynoah

3
나는 Rabih Kodeih에 동의합니다.이 답변은 더 많은 표가 필요합니다. 이 방법은 UPDATE / DELETE에서도 작동합니다. 이것은 훌륭합니다! :) +1
Charles Cavalcante

5
안타깝게도 내부 select stament에서 외부 select 문 열을 참조하려는 경우에는 작동하지 않습니다. 예 : 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

매력처럼 일했다! 그러나 나는 성능이 현명한 지 궁금합니다.
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
마이크 브랜트

0

이것은 당신의 상태를 추가하십시오

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

왜, 이것으로 무엇을 얻습니까?
Sebastian Palma

-1

왜 단순을 사용할 수 없습니까?

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

여기서 하위 쿼리는 무엇입니까?


4
오류가 있기 때문에 게시물이 여기에 있습니다 ..
:-P

당신의 쿼리는 그가하려는 것을 성취하지 못하기 때문입니다.
Jeff Ryan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.