@boobooking

Как написать запрос с внутренним объединением результатов двух JOIN-ов?

Помогите, пожалуйста, сделать выборку нужных данных. По логике получается, необходимо сначала сделать два join-a, а потом сделать внутреннее объединение их результатов. Но как сделать это не понимаю, и возможно есть более простое решение.

Итак, есть 3 таблицы и их упрощенная структура:
1) объявления (db_apartments)
apartment_id - уникальный идентификатор объявления
2) фотографии (db_images)
image_id - уникальный идентификатор фотографии
image_hash - хеш фотографии
3) линки связывающие в каком объявлении какие фотографии (db_apartments_images_links)
apartment_id
image_id

Сейчас возможна ситуация, когда одна фотография (один и тот же хеш) присутствует в таблице фотографий под разными image_id. Поэтому возможны ситуации, когда в одном объявлении присутствуют 2 одинаковые физически фотографии, но они представлены разными линками (на разные image_id ссылаются).

Задача:
Сделать выборку, которая отображает все объявления, в которых есть одинаковые по image_hash фотографии, но разные по image_id.

Заранее спасибо!
  • Вопрос задан
  • 118 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
SELECT *
    FROM `db_images` AS `i1`
    JOIN `db_images` AS `i2` ON `i1`.`image_hash` = `i2`.`image_hash` 
        AND `i1`.`image_id` != `i2`.`image_id`
    JOIN `db_apartments_images_links` AS `a1` ON `a1`.`image_id` = `i1`.`image_id`
    JOIN `db_apartments_images_links` AS `a2` ON `a2`.`image_id` = `i2`.`image_id`
        AND `a1`.`apartment_id` = `a2`.`apartment_id`
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Если я правильно понял вопрос, получится что-то типа такого:
SELECT DISTINCT a.apartment_id 
FROM db_apartments_images_links l
LEFT JOIN db_apartments a on a.apartment_id = l.apartment_id
INNER JOIN db_images im on (im.image_id=l.image_id and im.image_hash IN (
        SELECT i.image_hash
        FROM db_images i
        GROUP BY i.image_hash
        HAVING count(i.image_id) > 1
    )

)
ORDER BY a.apartment_id
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы