Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 1
Регистрация: 19.11.2016
Сообщений: 30

Как правильно сделать JOIN

19.02.2020, 00:52. Показов 1652. Ответов 4

Студворк — интернет-сервис помощи студентам
Приветствую.
Дана следующая структура: https://github.com/odota/core/... tables.sql
Меня интересуют только 2 таблицы: matches и teams

Хочу получить все матчи с участием определённой команды. Колонки matches.radiant_team_id и matches.dire_team_id могут пересекаться с teams.team_id
Для каждого матча teams.team_id может пересекаться либо с matches.radiant_team_id, либо с matches.dire_team_id

Результат должен быть таким:


Я в SQL не очень, за 3 часа смог соорудить такую конструкцию (она и дала результат на картинке):
SQL
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
SELECT 
  match_id, 
  radiant_team, 
  teams.name AS dire_team 
FROM 
  (
    SELECT 
      match_id, 
      teams.name AS radiant_team, 
      dire_team_id 
    FROM 
      matches 
      INNER JOIN teams ON matches.radiant_team_id = teams.team_id 
    WHERE 
      radiant_team_id = (
        SELECT 
          team_id 
        FROM 
          teams 
        WHERE 
          name = 'Aggressive Mode.'
      ) 
      OR dire_team_id = (
        SELECT 
          team_id 
        FROM 
          teams 
        WHERE 
          name = 'Aggressive Mode.'
      )
  ) AS temp_table 
INNER JOIN teams
  ON temp_table.dire_team_id = teams.team_id
Подскажите как можно получить тот же результат способом попроще?
Интерфейс для выполнения запросов находится тут: https://www.opendota.com/explorer
Нужно переключить тумблер "Toggle SQL" и можно выполнять запросы к этой базе
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.02.2020, 00:52
Ответы с готовыми решениями:

Что не правильно в JOIN и под запросом
Добрый день уважаемые! Прошу объяснить почему дублируются строки выборки, Есть 2 огромных таблицы c логами (2-5 млн записей) при...

Как правильно реализовать LEFT JOIN?
может баян, но у меня что то лыжи не едут) есть необходимость реализовать left join на linq. гугл выдает множество примеров с...

Как правильно взять данные из трех таблиц командой join?
Имеется код sql под oracle. Как взять данные из трех таблиц "клиенты" (ФИО), "услуги" (цена) и "заказы" (кол-во)? Последний блок...

4
0 / 0 / 1
Регистрация: 19.11.2016
Сообщений: 30
19.02.2020, 03:26  [ТС]
Я сделал немного по другому, тут хотя-бы прослеживается явный порядок действий)

SQL
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
WITH 
    team_id AS (
        SELECT
            team_id
        FROM
            teams
        WHERE
            name = 'Aggressive Mode.'
    ),
    
    temp_table AS (
        SELECT
            match_id,
            teams.name AS radiant_team,
            dire_team_id
        FROM
            matches
        INNER JOIN teams
            ON radiant_team_id = teams.team_id
        WHERE
            radiant_team_id = (SELECT * FROM team_id) OR
            dire_team_id = (SELECT * FROM team_id)
    )
    
SELECT
    match_id,
    radiant_team,
    teams.name AS dire_team
FROM
    temp_table
INNER JOIN teams
    ON dire_team_id = teams.team_id
0
1267 / 980 / 385
Регистрация: 02.09.2012
Сообщений: 3,027
19.02.2020, 21:32
Лучший ответ Сообщение было отмечено godzilla65536 как решение

Решение

SQL
1
2
3
4
5
6
7
8
9
10
SELECT 
  match_id, 
  tr.name AS radiant_team, 
  td.name AS dire_team 
FROM 
  matches AS m
  LEFT JOIN teams AS tr ON m.radiant_team_id = tr.team_id
  LEFT JOIN teams AS td ON m.dire_team_id = td.team_id
WHERE
  'Aggressive Mode.' IN (tr.name, td.name)
1
0 / 0 / 1
Регистрация: 19.11.2016
Сообщений: 30
19.02.2020, 22:44  [ТС]
Огромное спасибо!
Кровь из глаз не пошла, когда увидели мой громоздкий запрос?
Кстати, а по скорости выполнения ваш намного эффективнее?
0
1267 / 980 / 385
Регистрация: 02.09.2012
Сообщений: 3,027
20.02.2020, 06:38
Чтобы точно ответить на этот вопрос нужно а) план смотреть, б) гонять на реальных данных.
Из общего понимания могу сказать, что над оптимизацией нужно было бы еще работать и работать, что у вас, что у меня.
Мой запрос вероятно будет немного быстрее, потому что просто меньше операций используется.
Но плюс вашего запроса в явной возможности использовать индексы при поиске нужной команды в матчах.
У меня такая возможность отсутствует.
Поэтому все относительно.

Оптимальный запрос не всегда короткий.
Иногда приходиться извращаться, чтобы "научить" планировщик запроса в ПГ правильно строить план.
Поэтому кровь из глаз не пошла
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.02.2020, 06:38
Помогаю со студенческими работами здесь

Как правильно составить Inner Join с обращением к одной и той же таблице
не работает такой запрос Select Наименование, Фирма,Плательщик, Город, Договор FROM список_договоров Inner Join список_фирм ...

SQL запрос - как правильно с JOIN-ить и добраться до id-шника для связи
Помогите решить задачу Есть три таблицы: oc_product - товары | product_id | model | | 5863 | 55-55 | ...

Sqlite3, связь один ко многим, как ускорить выборку по ключу или правильно написать select. join
вот так создается таблица: sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS lib (id INT PRIMARY KEY NOT NULL, lid INT, name CHAR, path...

Как сделать то же самое, только через join?
SELECT * FROM t_page WHERE t_page.content = (SELECT t_page.content FROM t_Page WHERE t_Page.Page_Id = T_Page.Page_Id GROUP BY...

Как сделать inner join в JDBC при работе с MySQL ?
Подскажите, какой обьект мне использовать для обработки запроса, содержащего в тексте связывание нескольких таблиц по полям через inner...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru