CONCAT с тегами - PullRequest
       8

CONCAT с тегами

1 голос
/ 04 августа 2011

У меня есть следующий запрос, чтобы выбрать фотографии, их теги и некоторую основную информацию о пользователе:

SELECT photos.*, GROUP_CONCAT(tags.tag SEPARATOR ', ') AS photo_tags 
    FROM photos 
        INNER JOIN users 
            ON photos.upload_by = users.user_id
        INNER JOIN tags_photos 
            ON tags_photos.photo_id = photos.photo_id
        INNER JOIN tags 
            ON tags.tag_id = tags_photos.tag_id
    WHERE photos.status = '$status' 
        AND photos.photo_id IN (SELECT photos.photo_id 
                                    FROM photos
                                        JOIN tags_photos 
                                            ON photos.photo_id = tags_photos.photo_id
                                        JOIN tags 
                                            ON tags_photos.tag_id = tags.tag_id) 
    GROUP BY photos.photo_id 
    ORDER BY status, upload_date;

Работает хорошо, единственное исключение состоит в том, что если фотография не имеет тегов, она не возвращает эту фотографию. Я хотел бы, чтобы он все еще возвращал фотографию, даже если нет меток.

У кого-нибудь есть предложения?

Ответы [ 2 ]

1 голос
/ 04 августа 2011

Не знаю, зачем вам нужен подзапрос IN в предложении WHERE.

SELECT photos.*, GROUP_CONCAT(tags.tag SEPARATOR ', ') AS photo_tags 
    FROM photos 
        INNER JOIN users 
            ON photos.upload_by = users.user_id
        LEFT JOIN tags_photos 
            INNER JOIN tags 
                ON tags.tag_id = tags_photos.tag_id
            ON tags_photos.photo_id = photos.photo_id
    WHERE photos.status = '$status' 
    GROUP BY photos.photo_id 
    ORDER BY status, upload_date;
0 голосов
/ 04 августа 2011

Похоже, вам нужно RIGHT OUTER JOIN между tags_photos и photos

SELECT photos.*, GROUP_CONCAT(tags.tag SEPARATOR ', ') AS photo_tags FROM photos 
    INNER JOIN users ON photos.upload_by = users.user_id
    RIGHT OUTER JOIN tags_photos ON tags_photos.photo_id = photos.photo_id
    INNER JOIN tags ON tags.tag_id = tags_photos.tag_id
    WHERE photos.status = '$status' AND photos.photo_id IN (
        SELECT photos.photo_id 
        FROM photos
        LEFT OUTER JOIN tags_photos ON photos.photo_id = tags_photos.photo_id
        JOIN tags ON tags_photos.tag_id = tags.tag_id
    ) 
    GROUP BY photos.photo_id ORDER BY status, upload_date;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...