powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Лефт джоин селекта
10 сообщений из 10, страница 1 из 1
Лефт джоин селекта
    #39078073
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
select * from base limit 20;



Теперь мы хотим на каждую из этих 20 полезных "базовых" записей подцепить "справочные" данные.
Это всегда делается через left join по принципу если есть, то ок, если нет - то и фиг с ним.

Но в данном случае бяка заключается в том, что base.id = some.baseId то есть по айдишникам, по которым мы будем подцеплять справочные записи их в "справочной" таблице может быть несколько.

Насколько "криминально" лефт-джойнить селект и как замутить, чтобы исключить выборку по всей базе, а сузить сразу до списка айдишников, которые уже найдены по "базовой" таблице?

Код: sql
1.
2.
3.
4.
5.
select * from (select * from base limit 20) x 
    left join
    /* вот тут "криминал" */
    (select max(someId), * from some) y
    on y.baseId = x.baseId



Может вот так можно? Но что-то страшновато...))

Код: sql
1.
2.
3.
4.
5.
6.
7.
select * from (select * from base limit 20) x 
    left join
    /* попытка уйти от "криминала" */
    (select max(someId), * from some 
         where baseId in (select baseId from base limit 20)
    ) y
    on y.baseId = x.baseId
...
Рейтинг: 0 / 0
Лефт джоин селекта
    #39078076
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не вижу смысла ни в этих запросах, ни в самой задаче.

Но почему не сделать так:
Код: sql
1.
2.
3.
select * from (select * from base limit 20) x 
    left join some y
    on y.baseId = x.baseId

?
...
Рейтинг: 0 / 0
Лефт джоин селекта
    #39078091
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftНе вижу смысла ни в этих запросах, ни в самой задаче.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create table baser (id int, tit text);
create table faser (id int, tit text, baserId int);

insert into baser values (1, 'baser 1');
insert into baser values (2, 'baser 2');
insert into baser values (3, 'baser 3');

insert into faser values(1, 'faser 1', 1);
insert into faser values(2, 'faser 2', 1);
insert into faser values(3, 'faser 3', 2);
insert into faser values(4, 'faser 4', 2);
insert into faser values(5, 'faser 5', 2);

select * from baser left join faser on baser.id = faser.baserId;



Генерит такой вывод:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
id	tit	   id	   tit	           baserId
1	baser 1	   1	   faser 1	   1
1	baser 1	   2	   faser 2	   1
2	baser 2	   3	   faser 3	   2
2	baser 2	   4	   faser 4	   2
2	baser 2	   5	   faser 5	   2
3	baser 3	   NULL	   NULL	           NULL

Тогда как выдача должна содержать всего 3 записи из таблицы baser, а faser лишь дает справочные данные по самым "верхим" ("свежим") рядам (max(faser.id))

Код: plaintext
1.
2.
3.
4.
id	tit	   id	   tit	           baserId
1	baser 1	   2	   faser 2	   1
2	baser 2	   5	   faser 5	   2
3	baser 3	   NULL	   NULL	           NULL


Вот почему обычный джоин не катит...
...
Рейтинг: 0 / 0
Лефт джоин селекта
    #39078118
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Читать ФАК по выбору первой записи в группе.
...
Рейтинг: 0 / 0
Лефт джоин селекта
    #39078480
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix,
ты все не уймешься...

я же тебе писал, и ты даже что-то понял вроде...

join - дешевая операция, её не нужно экономить.

select не нужно писать особым образом, чтобы заставить сервер каким-то особенным образом его исполнять, для этого надо писать хинты.

то, что ты пытаешься сделать, вообще не нужно делать.
...
Рейтинг: 0 / 0
Лефт джоин селекта
    #39078489
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix,
а умножение строк - совсем другая проблема, очень странно, что ты поднимаешь справочники не по связи один ко многим, а по многие ко многим. так вообще не должно быть.
с базой у вас что-то не так...
...
Рейтинг: 0 / 0
Лефт джоин селекта
    #39078505
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivLumix,
а умножение строк - совсем другая проблема, очень странно, что ты поднимаешь справочники не по связи один ко многим, а по многие ко многим. так вообще не должно быть.
с базой у вас что-то не так...

ну, это не совсем справочники в классическом понимании... это не то же самое, что список городов... это больше похоже на теги...
...
Рейтинг: 0 / 0
Лефт джоин селекта
    #39078513
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixMasterZivLumix,
а умножение строк - совсем другая проблема, очень странно, что ты поднимаешь справочники не по связи один ко многим, а по многие ко многим. так вообще не должно быть.
с базой у вас что-то не так...

ну, это не совсем справочники в классическом понимании... это не то же самое, что список городов... это больше похоже на теги...

ОК, тогда вопрос -- тебе нужно видеть там все теги ?
Нужно -- JOIN-и.
Не нужно -- возми один, пометь как главный, и JOIN-и с ним только.
...
Рейтинг: 0 / 0
Лефт джоин селекта
    #39078517
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixНасколько "криминально" лефт-джойнить селект и как замутить, чтобы исключить выборку по всей базе, а сузить сразу до списка айдишников, которые уже найдены по "базовой" таблице?


Не криминально.


Код: sql
1.
2.
3.
4.
5.
select * from (select * from base limit 20) x 
    left join
    /* вот тут "криминал" */
    (select max(someId), * from some) y
    on y.baseId = x.baseId



Может вот так можно? Но что-то страшновато...))

Можно.

Но криминал в этом подзапросе:

Код: sql
1.
select max(someId), * from some



group by нужен, и * нужно убрать.

Код: sql
1.
2.
3.
4.
5.
6.
7.
select * from (select * from base limit 20) x 
    left join
    /* попытка уйти от "криминала" */
    (select max(someId), * from some 
         where baseId in (select baseId from base limit 20)
    ) y
    on y.baseId = x.baseId

[/quot]

У тебя тут тавтология:

where baseId in (select baseId from base limit 20)
) y
on y.baseId = x.baseId


Лишнее.
...
Рейтинг: 0 / 0
Лефт джоин селекта
    #39078522
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivНе нужно -- возми один, пометь как главный, и JOIN-и с ним только.

Вот это реально охренительное решение!!! Маркер основного тега!!!!

Просто будет отдельная процедура, которая периодически будет проставлять булевый флажок, а затем добавим в left join b on x.baseId = y.baseId && isMain = 1 и у нас сразу будет "одноуровневое умножение".

Так и сделаем!
Спасибо огромное!!
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Лефт джоин селекта
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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