2012-01-24 2 views
0

25 개의 레코드가있는 하나의 테이블이 있습니다. 표시 테이블의 열은 id, showid, artist_id, cityid입니다.여러 컬럼에 대해 mysql 하위 쿼리 최적화

동일한 쇼가 4 일 동안 발생하는 경우. 그러면 시스템 데이터는 다음과 같습니다 :

id, showid, artist_id, cityid, showid는 동일하게 유지됩니다.

245 1 1 3 2011-12-30 15시 0분 0초

245 1~3 2011-12-30 13시 0분 0초

3 245 1 19 3 2011-12-30 : 00 : 00

SELECT UT.user_id,UT.type_id, UT.type ,UT.track_time, 
(SELECT showid FROM shows WHERE FIND_IN_SET(UT.type_id,artist_id) ORDER BY created DESC LIMIT 1) as mainshowid, 
(SELECT cityid FROM shows WHERE FIND_IN_SET(UT.type_id,artist_id) ORDER BY created DESC LIMIT 1) as maincityid 
FROM user_details as UT WHERE UT.type='artist' ORDER BY UT.track_time desc limit 20; 

쿼리 욕망의 출력을주고있다하지만 난 하나의 서브 쿼리 또는 다른 방법에 의해 여러 열을 얻을 수있는 방법. 당신이 할 수있는

답변

0

: 작동

SELECT 
    UT.user_id, 
    UT.type_id, 
    UT.type, 
    UT.track_time, 
    s.showid AS mainshowid, 
    s.cityid AS maincityid 
FROM 
     user_details AS UT 
    JOIN 
     shows AS s 
    ON s.showid = 
     (SELECT showid 
     FROM shows 
     WHERE FIND_IN_SET(UT.type_id, artist_id) 
     ORDER BY created DESC 
     LIMIT 1 
     ) 
WHERE UT.type='artist' 
ORDER BY UT.track_time DESC 
LIMIT 20 ; 
+0

감사합니다. 그러나 우리는 그것을 최적화 할 수 있습니다. SELECT showid FROM shows WHERE FIND_IN_SET (UT.type_id, artist_id) ORDER BY 만든 DESC LIMIT 1 i 쇼 테이블에서 i가 1,500 만 행을가집니다. 왜냐하면 LIMIT 20을 제거한 후에 실행하면 많은 시간이 걸릴 것이기 때문이다. –

+0

'FIND_IN_SET()'을 사용하면 쉼표로 분리 된 컬럼이 있음을 알 수있다. 그건 좋지 않다. 여기에 이유를 읽어보십시오 : [데이터베이스 열에 쉼표로 구분 된 목록을 저장하는 것이 실제로 그렇게 나쁜 것입니까?] (http://stackoverflow.com/questions/3653462/is-storing-a-comma-separated-list-in-a-database - 칼럼 - 정말 - 나쁜 -). –

+0

성능을 원한다면 테이블을 표준화해야합니다. –