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를 공유하는 모든 행을 다시 인쇄합니다.
어떻게 방지 할 수 있습니까?
는 내가 거기에 조인 순서를 생각하고 왼쪽 외부 조인 조인과 일치하는 경우 널 (null)을 반환 할 것을 기억할 수 :
편집 : 난 단지 하나의 일치하는 레코드에 가입 한도에 다음과 같은 것을 사용 찾을 수 없습니다. 또는 dups를 없애기 위해 그룹을 사용하지만 마지막 수단으로 사용하십시오. 희망이 도움이됩니다. –
어떤 버전의 mysql을 사용하고 있습니까? 나는 이것을 발견했다 - 5.1에서의 독서 문서 NATURAL 조인 또는 USING 조인의 열은 이전과 다를 수있다. 특히 중복 출력 열이 더 이상 나타나지 않고 SELECT * 확장에 대한 열의 순서가 이전과 다를 수 있습니다. –
감사합니다. Sergey. 나는 실제로 이미 GROUP BY를 사용하여 시도했다. 이것은 실제로 예상대로 중복을 제거했지만 나중에 WHERE 절에서 구문 오류가 발생합니다. 이유는 무엇입니까? 왜 실제로 설명 할 손실이 있습니다 – gordyr