Люди (users).
Места (places). Например парк культуры и отдыха, театр, дворец спорта
Мероприятия (rides). Ну это когда я решил собрать компанию и сходить на балет а потом в пивбар
Соответственно таблицы-связки:
rides2users - кто идет на мероприятие
places2rides - какие места будем посещать
Что нужно:
1) Получить список мест, где я был хоть 1 раз
SELECT
DISTINCT p.id, p.*
FROM
places AS p
LEFT JOIN places2rides pr ON pr.place_id=p.id
LEFT JOIN rides2users ru ON ru.place_id=pr.place_id
WHERE
ru.user_id = %me%
окей
2) Добавить к прошлой выборке количество мероприятий, которые происходили в местах
SELECT
DISTINCT p.id, p.*,
(SELECT COUNT(*) FROM places2rides AS pr1 WHERE pr1.place_id=p.id) AS rides_count
FROM
places AS p
LEFT JOIN places2rides pr ON pr.place_id=p.id
LEFT JOIN rides2users ru ON ru.place_id=pr.place_id
WHERE
ru.user_id = %me%
окей, хотя такой подзапрос не очень хорош, лучше джоин ебануть наверно
3) Добавить к прошлой выборке количество людей, которые там были хоть 1 раз
SELECT
DISTINCT p.id, p.*,
(SELECT COUNT(*) FROM places2rides AS pr1 WHERE pr1.place_id=p.id) AS rides_count,
(
SELECT COUNT(DISTINCT ru1.user_id)
FROM places2rides AS pr2
LEFT JOIN rides2users ru1 ON ru1.place_id=p.id
WHERE pr2.place_id=p.id) AS users_count
FROM
places AS p
LEFT JOIN places2rides pr ON pr.place_id=p.id
LEFT JOIN rides2users ru ON ru.place_id=pr.place_id
WHERE
ru.user_id = %me%
психодел какой-то.
До этого времени запросы работают относительно быстро. Если у вас есть замечания и предложения - буду рад их услышать.
4) А теперь еще одно условие к прошлой выборке - нужно не все места, а только те, которые я вместе с Ваней посещал
SELECT
DISTINCT p.id, p.*,
(SELECT COUNT(*) FROM places2rides AS pr1 WHERE pr1.place_id=p.id) AS rides_count,
(
SELECT COUNT(DISTINCT ru1.user_id)
FROM places2rides AS pr2
LEFT JOIN rides2users ru1 ON ru1.place_id=p.id
WHERE pr2.place_id=p.id) AS users_count
FROM
places AS p
LEFT JOIN places2rides pr ON pr.place_id=p.id
LEFT JOIN rides2users ru ON ru.place_id=pr.place_id
LEFT JOIN places2rides pr3 ON pr3.place_id=p.id
LEFT JOIN rides2users ru3 ON ru3.place_id=pr3.place_id
WHERE
ru.user_id = %me% AND ru3.user_id = %ivan%
И все. Наступает кромешний пиздец. Запрос выполняется до 30 секунд. Че делать, господа?