Стол соединения mysql - без двойной итерации - PullRequest
0 голосов
/ 24 июня 2018

Позвольте мне начать с того, что это должна быть относительно простая проблема, которая была / была сделана ненужной усложнена плохим дизайном базы данных (не мной), который сказал, что я тоже не эксперт по MySQL.

Рассмотрим следующее

Таблица таблиц

enter image description here

Обратите внимание, что столбцы homeID и visitorID содержатназвания команд, а не фактические идентификаторы teamID

Чтобы исправить это, я создал новую таблицу со столбцами, содержащими teamID AND teamName, как видно на изображении ниже.

Настольные команды

enter image description here

Мои проблемы

Я должен получить идентификатор команды из table Teams для ОБА домашней команды и выездной команды

Итак, я создал таблицу Teams и этот простой скрипт:

SELECT schedule.*, teams.* FROM schedule JOIN teams ON schedule.homeID = teams.teamName OR schedule.visitorID = teams.teamName WHERE schedule.gameID = 411 LIMIT 1 #added Limit1 else the code generates to rows

Вывод скрипта mysql

Limit 1

enter image description here

Обратите внимание на то, как teamID равен генерируется только для 1 команды с Limit 1

Безлимитный оператор (двойная итерация)

enter image description here

Обратите внимание на то, как teamID может быть получен для ОБА команд. Проблема заключается в выполнении двойной итерации.

TLDR;Выше представлены следующие проблемы

  1. Сначала сценарий сгенерирует два вывода: один для домашней команды и один раз для выездной команды.Как и следовало ожидать, однако, я не могу иметь это.

  2. В качестве обходного пути к проблеме № 1 - я добавил Limit 1 проблема, с которой я сталкиваюсь Limit, хотя это то, что она дает толькообратно один teamID (как и следовало ожидать, я думаю)

Вопрос

Как я могу получить ОБА TeamID's из команд таблицы содна итерация?Надеюсь, что это имеет смысл ....

Extra

Демонстрация приложения с жестко закодированными названиями команд выглядит следующим образом (просто чтобы дать представление о том, что они пытаютсядостичь)

enter image description here

Ответы [ 3 ]

0 голосов
/ 24 июня 2018

Полагаю, вы хотите показать обе команды в одном ряду, а не в двух.
Если да, то вам нужно присоединиться к таблице teams дважды.

Рассмотрите эту демонстрацию: http://www.sqlfiddle.com/#!9/bb5e61/1

Это объединение объединит обе команды в один ряд:

SELECT s.*,
       t1.teamId as homeId_teamId,
       t1.teamCode as homeId_teamCode,
       t1.teamName as homeId_teamName,
       t2.teamId as visitorId_teamId,
       t2.teamCode as visitorId_teamCode,
       t2.teamName as visitorId_teamName      
FROM Schedule s
JOIN Teams t1 ON s.homeId = t1.teamName
JOIN Teams t2 ON s.visitorId = t2.teamName;

| id | homeId | visitorId | homeId_teamId | homeId_teamCode | homeId_teamName | visitorId_teamId | visitorId_teamCode | visitorId_teamName |
|----|--------|-----------|---------------|-----------------|-----------------|------------------|--------------------|--------------------|
|  1 | Poland |  Colombia |             1 |              PL |          Poland |                2 |                 CO |           Colombia |

Однако вы также можете рассмотреть ЛЕВЫЕ объединения вместо соединений INNER, которые будут работать в случае, когда естьв таблице TEAMS нет соответствующих данных:

SELECT s.*,
       t1.teamId as homeId_teamId,
       t1.teamCode as homeId_teamCode,
       t1.teamName as homeId_teamName,
       t2.teamId as visitorId_teamId,
       t2.teamCode as visitorId_teamCode,
       t2.teamName as visitorId_teamName      
FROM Schedule s
LEFT JOIN Teams t1 ON s.homeId = t1.teamName
LEFT JOIN Teams t2 ON s.visitorId = t2.teamName;

| id |   homeId | visitorId | homeId_teamId | homeId_teamCode | homeId_teamName | visitorId_teamId | visitorId_teamCode | visitorId_teamName |
|----|----------|-----------|---------------|-----------------|-----------------|------------------|--------------------|--------------------|
|  1 |   Poland |  Colombia |             1 |              PL |          Poland |                2 |                 CO |           Colombia |
|  3 | Ya Majka |    Poland |        (null) |          (null) |          (null) |                1 |                 PL |             Poland |
|  2 | Ya Majka |   Rossija |        (null) |          (null) |          (null) |           (null) |             (null) |             (null) |

Вот сценарии, которые составляют таблицы из примеров

CREATE TABLE Schedule(
  id int,   homeId varchar(20),visitorId varchar(20)
);

INSERT INTO Schedule VALUES
(1, 'Poland', 'Colombia' ),(2,'Ya Majka','Rossija'), 
(3,'Ya Majka','Poland');

CREATE TABLE Teams( 
  teamId int, teamCode varchar(10), teamName varchar(20)
);

INSERT INTO Teams VALUES
(1, 'PL', 'Poland' ),(2,'CO','Colombia'),(3,'US','United States');
0 голосов
/ 24 июня 2018

Вы можете использовать подзапрос (два из них в одном запросе), чтобы решить это:

select
  gameID, 
  weekNum,
  gameTimeEastern,
  (select teamName from teams where teamID = schedule.homeID) as homeName,
  homeScore,
  (select teamName from teams where teamID = schedule.visitorID) as visitorName,
  visitorScore from schedule;

Это не получает все столбцы из schedule, просто пример, чтобы показать, как этоработает.Если вам нужны различные запросы (включая select *, хотя это не является хорошей практикой, кроме тестирования), вы можете создать представление на основе запроса, подобного приведенному выше (со ВСЕМИ столбцами из расписания, за исключением замененных homeID и visitorID, которые заменяютсяс подзапросами из таблицы teams).Затем вы можете разместить запросы к этому представлению - и они будут работать как исходная таблица, в которой у вас были имена команд прямо в ней.

0 голосов
/ 24 июня 2018

Похоже, вы хотите присоединиться teams дважды к schedule.

SELECT s.*,
       th.*,
       ta.*
       FROM schedule s
            INNER JOIN teams th
                       ON s.homeid = th.teamname
            INNER JOIN teams ta
                       ON s.visitorid = ta.teamname 
       WHERE s.gameid = 411;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...