Как написать запрос с внутренним объединением результатов двух 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.
Для правильного вопроса надо знать половину ответа
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`
boobooking: Да в принципе направление неважно, поскольку все JOIN'ы типа INNER. Главное - условия объединения. Вот запрос с обратной последовательностью, тоже должен работать.
SELECT *
FROM `db_apartments_images_links` AS `a1`
JOIN `db_apartments_images_links` AS `a2` ON `a1`.`apartment_id` = `a2`.`apartment_id`
AND `a1`.`image_id` != `a2`.`image_id`
JOIN `db_images` AS `i1` ON `a1`.`image_id` = `i1_image_id`
JOIN `db_images` AS `i2` ON `a2`.`image_id` = `i2`.`image_id`
AND `i1`.`image_hash` = `i2`.`image_hash`
Если я правильно понял вопрос, получится что-то типа такого:
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