powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как составить запрос с категориями, чтобы джоин был в зависимости от типа категории?
13 сообщений из 13, страница 1 из 1
Как составить запрос с категориями, чтобы джоин был в зависимости от типа категории?
    #38877683
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например есть таблица contragent, в ней поле contragent_type, на нее ссылаются две таблицы ur и fiz, нумерация по id сквозная.
Нужно сделать джойн по той таблице, какой тип указан в поле contragent_type.

contragent ur fiz
id contragent_type id ur_name id fiz_name
1 ur 1 ООО "Рога"
2 ur 2 ООО "Копыта"
3 fiz 3 Иванов
4 fiz 4 Петров
5 ur 5 ООО "Хвосты"

Для юр.лиц:
Код: sql
1.
2.
3.
SELECT contragent_type, ur_name AS contragent_name
FROM contragent c
INNER JOIN ur u ON u.id = c.id


Для физ.лиц:
Код: sql
1.
2.
3.
SELECT contragent_type, fiz_name AS contragent_name
FROM contragent c
INNER JOIN fiz f ON f.id = c.id


А как совместить их в одну таблицу, чтобы в поле contragent_name были и названия юр.лиц, и названия физ.лиц?
...
Рейтинг: 0 / 0
Как составить запрос с категориями, чтобы джоин был в зависимости от типа категории?
    #38877688
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladНапример есть таблица contragent, в ней поле contragent_type, на нее ссылаются две таблицы ur и fiz, нумерация по id сквозная.
Нужно сделать джойн по той таблице, какой тип указан в поле contragent_type.

Код: plaintext
1.
2.
3.
4.
5.
6.
contragent                          ur                               fiz
id        contragent_type        id        ur_name             id        fiz_name
1         ur                           1         ООО "Рога"                  
2         ur                           2         ООО "Копыта"
3         fiz                                                             3        Иванов
4         fiz                                                             4        Петров
5         ur                           5         ООО "Хвосты"

Для юр.лиц:
Код: sql
1.
2.
3.
SELECT contragent_type, ur_name AS contragent_name
FROM contragent c
INNER JOIN ur u ON u.id = c.id


Для физ.лиц:
Код: sql
1.
2.
3.
SELECT contragent_type, fiz_name AS contragent_name
FROM contragent c
INNER JOIN fiz f ON f.id = c.id


А как совместить их в одну таблицу, чтобы в поле contragent_name были и названия юр.лиц, и названия физ.лиц?
...
Рейтинг: 0 / 0
Как составить запрос с категориями, чтобы джоин был в зависимости от типа категории?
    #38877699
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UNION
...
Рейтинг: 0 / 0
Как составить запрос с категориями, чтобы джоин был в зависимости от типа категории?
    #38877701
цеплять LEFT join-ом таблицы физиков и юриков к контрагентам. в селект листе сводить поля через coalesce
...
Рейтинг: 0 / 0
Как составить запрос с категориями, чтобы джоин был в зависимости от типа категории?
    #38877721
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - Эхцеплять LEFT join-ом таблицы физиков и юриков к контрагентам. в селект листе сводить поля через coalesce

зачем? чтобы увеличить обьём работы...мусклу.
...
Рейтинг: 0 / 0
Как составить запрос с категориями, чтобы джоин был в зависимости от типа категории?
    #38877745
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453Добрый Э - Эхцеплять LEFT join-ом таблицы физиков и юриков к контрагентам. в селект листе сводить поля через coalesce

зачем? чтобы увеличить обьём работы...мусклу.доо, лучше мы юнион влепим, чтобы создать темп-таблицу
Поподробнее про "увеличение объёма работы", пожалуйста. Насколько я понимаю, у ТСа обе связи "КА-физики" и "КА-юрики" - один к одному.
...
Рейтинг: 0 / 0
Как составить запрос с категориями, чтобы джоин был в зависимости от типа категории?
    #38877829
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tangliralex564657498765453пропущено...


зачем? чтобы увеличить обьём работы...мусклу.доо, лучше мы юнион влепим, чтобы создать темп-таблицу
Поподробнее про "увеличение объёма работы", пожалуйста. Насколько я понимаю, у ТСа обе связи "КА-физики" и "КА-юрики" - один к одному.
Один к одному.
Там на самом деле более сложный запрос, не физики и юрики, а категории транспорта (их 4) и в селекте множество полей с IF и т.д. Если юнион делать, то получается, в каждому из запросов эту шапку надо повторять, будет 4 одинаковых шапки больших.
...
Рейтинг: 0 / 0
Как составить запрос с категориями, чтобы джоин был в зависимости от типа категории?
    #38877833
Juhboot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tangliralex564657498765453пропущено...


зачем? чтобы увеличить обьём работы...мусклу.доо, лучше мы юнион влепим, чтобы создать темп-таблицу
Поподробнее про "увеличение объёма работы", пожалуйста. Насколько я понимаю, у ТСа обе связи "КА-физики" и "КА-юрики" - один к одному.Если взаимоисключающие поля, то именно left, вроде бы в современных бд он наконец работает ен медленее записи в старой нотации через "where ... = ...".
...
Рейтинг: 0 / 0
Как составить запрос с категориями, чтобы джоин был в зависимости от типа категории?
    #38877848
Juhboot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
svnvladtanglirпропущено...
доо, лучше мы юнион влепим, чтобы создать темп-таблицу
Поподробнее про "увеличение объёма работы", пожалуйста. Насколько я понимаю, у ТСа обе связи "КА-физики" и "КА-юрики" - один к одному.
Один к одному.
Там на самом деле более сложный запрос, не физики и юрики, а категории транспорта (их 4) и в селекте множество полей с IF и т.д. Если юнион делать, то получается, в каждому из запросов эту шапку надо повторять, будет 4 одинаковых шапки больших.Попробуй разные варианты, смотри производительность и подсказки оптимизатора. И зачем было приводить кастрированный пример? В БД очень всё конкретно должно настраиваться. Почти как когда на асме пишешь.
...
Рейтинг: 0 / 0
Как составить запрос с категориями, чтобы джоин был в зависимости от типа категории?
    #38877991
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно так написать, или NULL нельзя задать?
Код: sql
1.
2.
3.
4.
5.
6.
COALESCE( 
    IF (wc.id IS NULL, NULL, CONCAT_WS('' '', ''Вагон №'', wc.wagon_number)), 
    IF (ac.id IS NULL, NULL, CONCAT_WS('' '', ''Автомобиль'', c.car_number, c.car_brand_name)), 
    IF (vc.id IS NULL, NULL, CONCAT_WS('' '', ''Судно'', vc.vessel_name)), 
    IF (pc.id IS NULL, NULL, CONCAT_WS('' '', ''Склад'', pc.placement_name)), 
  ) AS from_object_name
...
Рейтинг: 0 / 0
Как составить запрос с категориями, чтобы джоин был в зависимости от типа категории?
    #38878123
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, такой получился запрос. Стоит ли его пробовать переписывать на UNION-ы (4 штуки).
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
  ADQuery1.SQL.Text :=
  'SELECT t.id, ' +

  '(IF ((transshipment_date = ''1899-12-30'') OR (transshipment_date IS NULL), ' +
        '''00.00.0000'', DATE_FORMAT(transshipment_date, ''%d.%m.%Y'')) ) AS transshipment_date_rus, ' +

  'CASE o_from.trans_object_type ' +
  ' WHEN ''wagon'' THEN ''ВАГОН''' +
  ' WHEN ''auto'' THEN ''АВТОМОБИЛЬ''' +
  ' WHEN ''vessel'' THEN ''СУДНО''' +
  ' WHEN ''placement'' THEN ''СКЛАД'' END AS from_object_type_rus, ' +

  'COALESCE(' +
    'IF (wc1.id IS NULL, NULL, CONCAT_WS('' '', ''Вагон №'', wc1.wagon_number)), '+
    'IF (ac1.id IS NULL, NULL, CONCAT_WS('' '', ''Автомобиль '', c1.car_number, cb1.car_brand_name)), ' +
    'IF (vc1.id IS NULL, NULL, CONCAT_WS('' '', ''Судно '', vc1.vessel_name)), ' +
    'IF (pc1.id IS NULL, NULL, CONCAT_WS('' '', ''Склад '', pc1.placement_name)) ' +
  ') AS from_object_name, ' +

  'CASE o_to.trans_object_type ' +
  ' WHEN ''wagon'' THEN ''ВАГОН''' +
  ' WHEN ''auto'' THEN ''АВТОМОБИЛЬ''' +
  ' WHEN ''vessel'' THEN ''СУДНО''' +
  ' WHEN ''placement'' THEN ''СКЛАД'' END AS from_object_type_rus, ' +

  'COALESCE(' +
    'IF (wc2.id IS NULL, NULL, CONCAT_WS('' '', ''Вагон №'', wc2.wagon_number)), '+
    'IF (ac2.id IS NULL, NULL, CONCAT_WS('' '', ''Автомобиль '', c2.car_number, cb2.car_brand_name)), ' +
    'IF (vc2.id IS NULL, NULL, CONCAT_WS('' '', ''Судно '', vc2.vessel_name)), ' +
    'IF (pc2.id IS NULL, NULL, CONCAT_WS('' '', ''Склад '', pc2.placement_name)) ' +
  ') AS to_object_name ' +

  'FROM transshipment t ' +

  'INNER JOIN trans_object o_from ON o_from.id = t.from_object_id ' +
  'LEFT JOIN wagon_card wc1 ON wc1.id = o_from.id ' +
  'LEFT JOIN auto_card ac1 ' +
    'INNER JOIN car_driver cd1 ON cd1.id = ac1.car_driver_id ' +
    'INNER JOIN car c1 ON c1.id = cd1.car_id ' +
    'INNER JOIN car_brand cb1 ON cb1.id = c1.car_brand_id ' +
    'INNER JOIN driver d1 ON d1.id = cd1.driver_id ' +
  'ON ac1.id = o_from.id ' +
  'LEFT JOIN vessel_card vc1 ON vc1.id = o_from.id ' +
  'LEFT JOIN placement_card pc1 ON pc1.id = o_from.id ' +

  'INNER JOIN trans_object o_to ON o_to.id = t.to_object_id ' +
  'LEFT JOIN wagon_card wc2 ON wc2.id = o_to.id ' +
  'LEFT JOIN auto_card ac2 ' +
    'INNER JOIN car_driver cd2 ON cd2.id = ac2.car_driver_id ' +
    'INNER JOIN car c2 ON c2.id = cd2.car_id ' +
    'INNER JOIN car_brand cb2 ON cb2.id = c2.car_brand_id ' +
    'INNER JOIN driver d2 ON d2.id = cd2.driver_id ' +
  'ON ac2.id = o_to.id ' +
  'LEFT JOIN vessel_card vc2 ON vc2.id = o_to.id ' +
  'LEFT JOIN placement_card pc2 ON pc2.id = o_to.id ' +
...
Рейтинг: 0 / 0
Как составить запрос с категориями, чтобы джоин был в зависимости от типа категории?
    #38878127
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как составить запрос с категориями, чтобы джоин был в зависимости от типа категории?
    #38878546
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tangliralex564657498765453пропущено...


зачем? чтобы увеличить обьём работы...мусклу.доо, лучше мы юнион влепим, чтобы создать темп-таблицу
Поподробнее про "увеличение объёма работы", пожалуйста. Насколько я понимаю, у ТСа обе связи "КА-физики" и "КА-юрики" - один к одному.

сдесь имеется моя тема, где была аналогичная ситуация.

у меня денормализованная структура была, только там три поля было, и все ссылки в другое место.

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


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