2012-01-26 4 views
0

EDIT : 나를 위해이 문제를 해결하기위한 세르게이에게 감사드립니다. 그가 도착하자마자 나는 대답 할 것입니다. 나는 표를하고 대답 할 것입니다. 이 쿼리는 여러 테이블에서 모든 정보를 반환MYSQL 쿼리 중복 행 중 하나가 조인의

SELECT SQL_CALC_FOUND_ROWS 
    songsID, song_name, artist_band_name, author, song_artwork, song_file, 
    genre, song_description, uploaded_time, emotion, tempo, 
    user, happiness, instruments, similar_artists, play_count, 
    projects_count, 
    rating, ratings_count, waveform, datasize, display_name, user_url, genre_id, 
    IF(user_ratings_count, 'User Voted', 'Not Voted') as voted 
FROM (
     SELECT 
      sp.songsID, projects_count, 
      AVG(rating) as rating, 
      COUNT(rating) AS ratings_count, 
      COUNT(IF(userid=$userid, 1, NULL)) as user_ratings_count 

       FROM (
        SELECT songsID, COUNT(*) as projects_count 
        FROM $sTable s 
        LEFT JOIN $sTable2 p ON s.songsID = p.songs_id 

        GROUP BY songsID) as sp 

      LEFT JOIN $sTable3 r ON sp.songsID = r.songid   

      GROUP BY sp.songsID) as spr 

LEFT JOIN $sTable6 gs ON gs.song_id = songsID 

JOIN $sTable s USING (songsID) 
LEFT JOIN $sTable5 q ON s.user = q.ID 

동안 (모든 등 안정적인 $, $ sTable2, $ sTable3로 지정) 나를 복제주고있다 : 아래 그림과 같이

내 쿼리입니다 행은 $ sTable6을 기반으로합니다. $ sTable6 자리에 가입하기로

이 발생합니다, 아래에서 라인 셋째 :

LEFT JOIN $sTable6 gs ON gs.song_id = songsID 

이 라인은 모두 괜찮 제거. 그러나 나는 'genre_id'에 의해 동적 필터링을 제공하기 위해이 정보를 검색해야합니다. 현재는 $ sTable의 모든 행을 다른 여러 테이블의 모든 해당 정보와 함께 검색하지만 $ sTable에서 $ sTable6과 함께 song_id/songsID를 공유하는 모든 행을 다시 인쇄합니다.

어떻게 방지 할 수 있습니까?

+0

는 내가 거기에 조인 순서를 생각하고 왼쪽 외부 조인 조인과 일치하는 경우 널 (null)을 반환 할 것을 기억할 수 :

편집 : 난 단지 하나의 일치하는 레코드에 가입 한도에 다음과 같은 것을 사용 찾을 수 없습니다. 또는 dups를 없애기 위해 그룹을 사용하지만 마지막 수단으로 사용하십시오. 희망이 도움이됩니다. –

+0

어떤 버전의 mysql을 사용하고 있습니까? 나는 이것을 발견했다 - 5.1에서의 독서 문서 NATURAL 조인 또는 USING 조인의 열은 이전과 다를 수있다. 특히 중복 출력 열이 더 이상 나타나지 않고 SELECT * 확장에 대한 열의 순서가 이전과 다를 수 있습니다. –

+0

감사합니다. Sergey. 나는 실제로 이미 GROUP BY를 사용하여 시도했다. 이것은 실제로 예상대로 중복을 제거했지만 나중에 WHERE 절에서 구문 오류가 발생합니다. 이유는 무엇입니까? 왜 실제로 설명 할 손실이 있습니다 – gordyr

답변

0

LEFT JOIN 된 테이블에 song_id가 중복되어 있습니다.

LEFT JOIN $sTable6 gs ON gs.song_id = songsID AND gs.MYUNIQUECOLUMN IN (SELECT MYUNIQUECOLUMN FROM $sTable6 WHERE song_id = songsID ORDER BY MYUNIQUECOLUMN LIMIT 1) 
+0

감사합니다 ElJay 오른쪽에 대해 쳐다 본다! (http://chat.stackoverflow.com/rooms/7086/discussion-between-sergey-benner-and-gordyr) 불행히도 내 mysql 업 그레 이드 완전히 borked로서 그것을 테스트하지 못할 수 있습니다! worryingly 나는 remi repo에서 찾을 수없는 꾸러미를 계속 얻고 있기 때문에 그것을 재설치하는 데 어려움을 겪고있다! * 공황 * – gordyr

+0

@ gordyr, 나는 MySQL에 익숙하지 않다. 그러나 Gentoo 이외에는 설치가되지 않는다. 그래서 나는 거기서 도울 수 없다. 위의 SQL을 수정했는데 (이 방법은 아무 것도 해결하지 못했을 것입니다) –

+0

이 경우 첫 번째 순서로 1 개의 songId에만 참여하게됩니다. 그걸하고 싶니? 이 경우에는 내가 선택한 모든 노래에 대해 genreId가 필요하기 때문에 검색어에서 감각을 전혀 볼 수 없습니다. 유일한 첫 번째 노래는 표 6에서 가져온 것이 아닙니다.내가 잘못 알고 있니? –