qualitat
@qualitat

Как составить запрос с критерием в другой таблице?

Добрый день друзья.

Исходные данные:

Таблица Users
user_id name

1 Витя
2 Иван
3 Вася

Таблица Children (дети) содержит id, id родителя (user_id), а также флаг говорящий о том есть ли у текущего ребенка дети (has_child 1-есть, 0-нет)
ch_id user_id has_child

1 | 1 | 0
2 | 1 | 0
3 | 2 | 1
4 | 2 | 0
5 } 2 | 1

Моя задача получить ID пользователей из первой таблицы у которых нет внуков. Соответственно сюда попадут пользователи Витя и Вася (id = 1, id = 3). У Вити есть двое детей, но у этих детей нет своих детей. У Васи вобще нет детей соответственно и внуков нет.

До текущего момента я решал эту задачу двумя этапами. Первый это получал список всех пользователей, а затем циклом проходился по таблице children с таким SELECT * from children WHERE user_id = :user_id AND has_child = 1, если возвращалась хотя бы одна запись то у пользователя есть внуки и мне он не нужен.

Сейчас таблицы стали большими, и запрос внутрь цикла пихать стало затратно.

Заранее благодарен за помощь
  • Вопрос задан
  • 50 просмотров
Пригласить эксперта
Ответы на вопрос 1
@ynblpb_spb
дятел php
SELECT u.*, COUNT(c.has_child) as sum, SUM(c.has_child) as sum2 FROM users as u LEFT JOIN children as c ON (c.user_id = u.id) GROUP BY c.user_id HAVING (sum = 0 OR sum2 = 0)


Скорость работы будет скорее всего печальная.

Смотря какое приложение, если важны данные сиюминутные, то придется бороться с запросами такими вот.
Если обновление данные не сильно критично, то можно в таблице добавить поле is_grandpa и это поле по крону раз в минуту обновлять либо как обновляли ранее, либо моим запросом выше. И запрос на выборку упростится до смешного )
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Кенарий Санкт-Петербург
от 120 000 до 300 000 ₽
от 90 000 до 110 000 ₽
от 100 000 до 220 000 ₽
23 сент. 2020, в 20:17
100000 руб./за проект
23 сент. 2020, в 20:15
12000 руб./за проект
23 сент. 2020, в 20:14
1000 руб./за проект