MYSQL-запрос, производящий повторяющиеся строки, один из JOIN'ов - PullRequest
0 голосов
/ 27 января 2012

РЕДАКТИРОВАТЬ: Огромное спасибо Сергею за решение этой проблемы для меня. Как только он получит ответ в виде ответа, я отмечу его и отвечаю.

Мой запрос показан ниже:

 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   

В то время как этот запрос возвращает всю информацию из различных таблиц (все обозначены как $ sTable, $ sTable2, $ sTable3 и т. Д.), Он дает мне повторяющиеся строки на основе $ sTable6.

Это происходит только при наличии $ sTable6 JOIN, третья строка снизу:

LEFT JOIN $sTable6 gs ON gs.song_id = songsID  

С этой удаленной строкой все в порядке. Однако мне нужно получить эту информацию, чтобы обеспечить динамическую фильтрацию по 'genre_id'. В настоящее время он извлекает все строки из $ sTable вместе со всей соответствующей информацией из других таблиц, но также перепечатывает любые строки в $ sTable, которые используют song_id / songsID с $ sTable6.

Как я могу предотвратить это?

1 Ответ

0 голосов
/ 27 января 2012

У вас есть дубликаты song_id в таблице LEFT JOINed.Я использую что-то вроде следующего, чтобы ограничить это JOIN только одной соответствующей записью:

EDITED:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...