Гость
Map
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Фильтр по колонке из вложенного запроса / 7 сообщений из 7, страница 1 из 1
09.02.2022, 00:21
    #40132716
OlegROA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фильтр по колонке из вложенного запроса
Добрый день.

Есть табличка `users` с деревом и связью по `id` - `parent_id`.
И табличка, скажем, `mlm`, в которой могут быть юзеры из `users` - связь mlm.id - users.id.
Нужно получить список юзеров первого уровня родителя `id`=1 И, которые есть в `mlm` ИЛИ у которых есть свои детки.

Есть такой запрос:
Код: sql
1.
2.
3.
4.
5.
SELECT mem.`id`, mlm.`id` AS in_mlm,
            (SELECT chl.`id` FROM `users` AS chl WHERE (chl.`parent_id` = mem.`id`) LIMIT 1) AS isChl
FROM `users` AS mem
LEFT JOIN mlm ON mem.`id` = mlm.`id`
WHERE (mem.`parent_id` = 1)


После из результатов этого запроса с помощью полей in_mlm и isChl отсеиваются лишние записи.

Подскажите - как сделать это одни запросом?
Делаю вот так:
Код: sql
1.
2.
3.
4.
5.
SELECT mem.`id`, mlm.`id` AS in_mlm,
            (SELECT chl.`id` FROM `users` AS chl WHERE (chl.`parent_id` = mem.`id`) LIMIT 1) AS isChl
FROM `users` AS mem
LEFT JOIN mlm ON mem.`id` = mlm.`id`
WHERE (mem.`parent_id` = 1) and (in_mlm or isChl)


Но ругается, что не знает таких колонок - in_mlm и isChl.
Заменил in_mlm:
Код: sql
1.
2.
3.
4.
5.
SELECT mem.`id`, mlm.`id` AS in_mlm,
            (SELECT chl.`id` FROM `users` AS chl WHERE (chl.`parent_id` = mem.`id`) LIMIT 1) AS isChl
FROM `users` AS mem
LEFT JOIN mlm ON mem.`id` = mlm.`id`
WHERE (mem.`parent_id` = 1) and (mlm.`id` or isChl)


А как заменить isChl?

Спасибо!
...
Рейтинг: 0 / 0
09.02.2022, 08:03
    #40132742
paver
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фильтр по колонке из вложенного запроса
OlegROA

После из результатов этого запроса с помощью полей in_mlm и isChl отсеиваются лишние записи.
Подскажите - как сделать это одни запросом?

Обернуть внешним запросом, например.
OlegROA

Но ругается, что не знает таких колонок - in_mlm и isChl.

Выражения селекта вычисляются в последнюю очередь, для фильтра WHERE их еще не существует.

А почему не просто?:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT u.id
FROM users u
JOIN users uc ON uc.parent_id = u.id
WHERE u.parent_id = 1
UNION
SELECT u.id
FROM users u
JOIN mlm m USING(id)
WHERE u.parent_id = 1


https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=0f72da88ab4a92194ffb4fe3dcfc5ac3
...
Рейтинг: 0 / 0
09.02.2022, 17:34
    #40132878
OlegROA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фильтр по колонке из вложенного запроса
paver
OlegROA

После из результатов этого запроса с помощью полей in_mlm и isChl отсеиваются лишние записи.
Подскажите - как сделать это одни запросом?

Обернуть внешним запросом, например.
OlegROA

Но ругается, что не знает таких колонок - in_mlm и isChl.

Выражения селекта вычисляются в последнюю очередь, для фильтра WHERE их еще не существует.

А почему не просто?:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT u.id
FROM users u
JOIN users uc ON uc.parent_id = u.id
WHERE u.parent_id = 1
UNION
SELECT u.id
FROM users u
JOIN mlm m USING(id)
WHERE u.parent_id = 1



Ну, мне из mlm нужны некоторые данные.
И, кроме всего прочего, мне в результате запроса нужны признаки in_mlm и isChl.
Т.е., кроме ид юзеров нужны их данные из mlm и флаги "есть его данные в mlm" и "есть у него детки".
...
Рейтинг: 0 / 0
10.02.2022, 10:27
    #40133036
paver
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фильтр по колонке из вложенного запроса
OlegROA

Ну, мне из mlm нужны некоторые данные.
И, кроме всего прочего, мне в результате запроса нужны признаки in_mlm и isChl.
Т.е., кроме ид юзеров нужны их данные из mlm и флаги "есть его данные в mlm" и "есть у него детки".


Ну тогда типа так:
Код: sql
1.
2.
3.
4.
5.
SELECT DISTINCT u.id, IF(uc.id,1,0) if_cld, IF(m.id,1,0) in_mlm, m.dat
FROM users u
LEFT JOIN users uc ON uc.parent_id = u.id
LEFT JOIN mlm m ON m.id = u.id
WHERE u.parent_id = 1 AND (uc.id OR m.id)



https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=00aea56c164dcec4268929238c50ddac
...
Рейтинг: 0 / 0
10.02.2022, 13:44
    #40133137
paver
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фильтр по колонке из вложенного запроса
Ну или
OlegROA

Делаю вот так:
Код: sql
1.
2.
3.
4.
5.
SELECT mem.`id`, mlm.`id` AS in_mlm,
            (SELECT chl.`id` FROM `users` AS chl WHERE (chl.`parent_id` = mem.`id`) LIMIT 1) AS isChl
FROM `users` AS mem
LEFT JOIN mlm ON mem.`id` = mlm.`id`
WHERE (mem.`parent_id` = 1) and (in_mlm or isChl)


Но ругается, что не знает таких колонок - in_mlm и isChl.

Перенести условие отсеивания в HAVING
Код: sql
1.
2.
3.
4.
5.
6.
SELECT mem.`id`, mlm.`id` AS in_mlm,
            (SELECT chl.`id` FROM `users` AS chl WHERE (chl.`parent_id` = mem.`id`) LIMIT 1) AS isChl
FROM `users` AS mem
LEFT JOIN mlm ON mem.`id` = mlm.`id`
WHERE (mem.`parent_id` = 1)
HAVING in_mlm or isChl
...
Рейтинг: 0 / 0
10.02.2022, 16:55
    #40133260
OlegROA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фильтр по колонке из вложенного запроса
Спасибо!
Я был уверен, что HAVING можно использовать только с GROUP BY :(
...
Рейтинг: 0 / 0
11.02.2022, 09:49
    #40133385
paver
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фильтр по колонке из вложенного запроса
OlegROA

Я был уверен, что HAVING можно использовать только с GROUP BY :(

WHERE работает до агрегирования, а HAVING после, когда все агрегаты уже вычислены и, в случае mysql, определены алиасы списка выбора. Собственно необходимости агрегации для HAVING нет никакой. НО. По замыслу HAVING работает не с первичными, а с уже сгруппированными данными, поэтому никакие индексы уже не действуют и отсев по HAVING осуществляется полным просмотром поступившей ему на вход таблицы. Поэтому использование HAVING без GROUP BY с точки зрения эффективности чаще всего малополезно. Лучше воспользоваться предложенным вариантом с двумя левыми джойнами или, может быть, с помощью оконных функций (но я в них полный нуб).
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Фильтр по колонке из вложенного запроса / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]