powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / join 1:1 для неоднозначных данных
5 сообщений из 5, страница 1 из 1
join 1:1 для неоднозначных данных
    #39613228
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица t1 с полями CODE и DEVTYPER. CODE это идентификатор, DEVTYPER это тип записи, может принимать значения 3 и 16.
Есть таблица t2 с полями CODE и DEVTYPER. Таблица подобна таблице t2, но содержит записи других типов и DEVTYPER может принимать значения 4.
Еще есть таблица t3 с полями CODE и рядом других полей.

Есть таблица ta с полями CODE и TYPER, в которой содержаться дополнительные данные для таблиц t1, t2, t3:
- для таблицы t3 условие соединения такое: ta.CODE=t3.CODE and ta.TYPER=1
- для таблицы t2 условие соединения такое: ta.CODE=t2.CODE and ta.TYPER=t2.DEVTYPER
- для таблицы t1 условие соединения такое: ta.CODE=t1.CODE and ta.TYPER=3
Но иногда по каким-то причинам для t1.DEVTYPER=16 возможно ta.TYPER=16, поэтому для соединения с t1 мне нужен такой алгоритм:
1. Делаю ta.CODE=t1.CODE and ta.TYPER=3, если в результате соединения получается одна строка (соединение 1:1), то ок.
2. Делаю ta.CODE=t1.CODE and ta.TYPER=t1.DEVTYPER, если в результате соединения получается одна строка (соединение 1:1), то ок.
3. Делаю ta.CODE=t1.CODE, если в результате соединения получается несколько строк, то отбираю первую строку для критерия сортировки (в порядке предпочтения) DEVTYPER=3, DEVTYPER=16.

Можно ли такое соединение в MySQL сделать малой кровью?
...
Рейтинг: 0 / 0
join 1:1 для неоднозначных данных
    #39613244
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.для соединения с t1 мне нужен такой алгоритм:
1. Делаю ta.CODE=t1.CODE and ta.TYPER=3, если в результате соединения получается одна строка (соединение 1:1), то ок.
2. Делаю ta.CODE=t1.CODE and ta.TYPER=t1.DEVTYPER, если в результате соединения получается одна строка (соединение 1:1), то ок.
3. Делаю ta.CODE=t1.CODE, если в результате соединения получается несколько строк, то отбираю первую строку для критерия сортировки (в порядке предпочтения) DEVTYPER=3, DEVTYPER=16.
Нахрена надо было описывать в пень ненужные t2 и t3?

Alibek B.если в результате соединения получается одна строка (соединение 1:1), то ок.И далее не обрабатывать?
Для такого случая следует отбирать наиболее широкий вариант (ON ta.CODE=t1.CODE), а затем строить выражение, которое по мере продвижения по списку условий возрастает (или убывает), типа
Код: sql
1.
2.
3.
4.
5.
6.
CASE WHEN ta.TYPER=3           THEN 1
     WHEN ta.TYPER=t1.DEVTYPER THEN 2
     WHEN t1.DEVTYPER=3        THEN 3
     WHEN t1.DEVTYPER=16       THEN 4
                               ELSE 5
END

и при сортировке по нему выбирать первую запись из группы (см. FAQ).

Альтернативный вариант - UNION каждого из запросов, дополненного статическим полем "веса условия".
...
Рейтинг: 0 / 0
join 1:1 для неоднозначных данных
    #39613271
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaНахрена надо было описывать в пень ненужные t2 и t3?
Потому что в них тоже есть CODE (и даже DEVTYPER), с которыми могут быть совпадения.

Akinaи при сортировке по нему выбирать первую запись из группы (см. FAQ).
Имеется ввиду эти способы со всеми их особенностями?
FAQ старый, я надеялся, что в новых версиях MySQL появилось что-то более удобное.

AkinaАльтернативный вариант - UNION каждого из запросов, дополненного статическим полем "веса условия".
Пожалуй да, это будет проще.
...
Рейтинг: 0 / 0
join 1:1 для неоднозначных данных
    #39613278
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Потому что в них тоже есть CODE (и даже DEVTYPER), с которыми могут быть совпадения.Да наплевать, что там есть... В алгоритме выбора они упоминаются? нет. На итоговую выборку влияют? нет. Нахрена?
Alibek B.Имеется ввиду эти способы со всеми их особенностями?Именно.
Alibek B.FAQ старыйFAQ - актуальный.
Alibek B.я надеялся, что в новых версиях MySQL появилось что-то более удобное.Да не вопрос - версия 8.0, там есть оконные функции... будешь ставить?
...
Рейтинг: 0 / 0
join 1:1 для неоднозначных данных
    #39613284
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaНа итоговую выборку влияют?
Влияют. Если вообще не учитывать TYPER, то получившиеся неоднозначности (из таблиц t2 и t3) невозможно будет разрешить.
Поэтому для TYPER=4 и TYPER=1 их нужно исключать (если собирать запрос из UNION) или учитывать (если использовать один сложный запрос).
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / join 1:1 для неоднозначных данных
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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