Как сделать JOIN из двух разных столбцов в один и тот же столбец в отдельной таблице - PullRequest
1 голос
/ 03 августа 2011

У меня есть два столбца в одной таблице, которые ссылаются на один и тот же столбец во второй таблице, чтобы получить имя, которое относится к указанному идентификатору.

Ниже приведен мой запрос, который не работает,Два ЛЕВЫХ СОЕДИНЕНИЯ на invTypes вызывают проблему.Я читал и читал и ломал голову над этим.Я не могу понять, как заставить это возвращать имена, которые принадлежат идентификаторам, которые появляются в двух отдельных местах в главной таблице.

Что следует отметить без публикации всей структуры базы данных (чтоогромен)

и typeID и itemTypeID присутствуют на главном столе.Каждый из них ссылается на один и тот же столбец typeID в таблице invTypes.Таблица invTypes содержит имя, соответствующее указанному идентификатору.

Кроме того, в части оператора SELECT typeName происходит из invTypes, а stationName - из таблицы staStations.

Основной вопрос заключается в том, что если invTypes. typeName упоминается два раза из двух столбцов, как мне 1: правильно соединить таблицы с этими двумя точками, а 2: как определить разницу вдва invTypes. typeName, которые должны быть возвращены, если можно сделать два оператора JOIN.

SELECT 
`logTime`,`itemID`,`typeName`,`actorName`,`stationName`,`action`,`passwordType`,
`quantity`,`oldConfiguration`,`newConfiguration` 
        FROM eve_container_audit 
        LEFT JOIN invTypes ON eve_container_audit.typeID = invTypes.typeID
        LEFT JOIN invTypes ON eve_container_audit.itemTypeID = invTypes.typeID

        LEFT JOIN staStations ON eve_container_audit.locationID = staStations.stationID

Ответы [ 3 ]

1 голос
/ 03 августа 2011

Попробуй это. В основном создайте второй псевдоним той же таблицы. При выборе обращайтесь к inv1 или inv2 специально для получения правильных значений.

SELECT 
     `logTime`,`itemID`, inv1.`typeName` as main_type , inv2.`typeName` as sub_type, `actorName`,`stationName`,`action`,`passwordType`,
     `quantity`,`oldConfiguration`,`newConfiguration` 
FROM eve_container_audit 
      LEFT JOIN invTypes as inv1 ON eve_container_audit.typeID = inv1.typeID
      LEFT JOIN invTypes as inv2 ON eve_container_audit.itemTypeID = inv2.typeID
      LEFT JOIN staStations ON eve_container_audit.locationID = staStations.stationID
1 голос
/ 03 августа 2011

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

...
LEFT JOIN invTypes ON eve_container_audit.typeID = invTypes.typeID
LEFT JOIN invTypes ON eve_container_audit.itemTypeID = invTypes.typeID
...

вместо этого должно быть что-то вроде

...
LEFT JOIN invTypes AS invtypes1 ON
    eve_container_audit.typeID = invtypes1.typeID
LEFT JOIN invTypes AS invtypes2 ON
    eve_container_audit.itemTypeID = invtypes2.typeID
...
1 голос
/ 03 августа 2011

Вот как можно присоединиться к ним только один раз:

SELECT 
  `logTime`,
  `itemID`,
  `typeName`,
  `actorName`,
  `stationName`,
  `action`,
  `passwordType`,
  `quantity`,
  `oldConfiguration`,
  `newConfiguration` 
FROM
  eve_container_audit 
LEFT JOIN
  invTypes
ON
  eve_container_audit.typeID = invTypes.typeID and
  eve_container_audit.itemTypeID = invTypes.typeID
LEFT JOIN
  staStations
ON
  eve_container_audit.locationID = staStations.stationID

Если вам нужно присоединиться к ним дважды, используйте псевдоним:

SELECT 
  `logTime`,
  `itemID`,
  `typeName`,
  `actorName`,
  `stationName`,
  `action`,
  `passwordType`,
  `quantity`,
  `oldConfiguration`,
  `newConfiguration` 
FROM
  eve_container_audit 
LEFT JOIN
  invTypes
ON
  eve_container_audit.typeID = invTypes.typeID
LEFT JOIN
  invTypes invTypes2
ON
  eve_container_audit.itemTypeID = invTypes2.typeID
LEFT JOIN
  staStations
ON
  eve_container_audit.locationID = staStations.stationID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...