Как сделать mysql соединение, где соединение может исходить из той или иной таблицы - PullRequest
1 голос
/ 13 сентября 2011

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

SELECT eve_member_list.`characterID` ,eve_member_list.`name` 
FROM `eve_mining_op_members`
INNER JOIN eve_member_list ON eve_mining_op_members.characterID = eve_member_list.characterID
WHERE op_id = '20110821105414-741653460';

Моя проблема в том, что у меня есть два разных списка участников, один из которых - участники, которые принадлежат нашей группеа второй список - это список участников, не принадлежащих к нашей группе.

Как мне написать этот запрос, чтобы, если член не найден в таблице eve_member_list, он выглядел в eve_nonmember_member_list таблица, соответствующая от eve_mining_op_members.characterID до charName

Заранее извиняюсь, если вопрос трудно прочитать, поскольку я не совсем уверен, как правильно спросить, что именно я ищу.

Ответы [ 3 ]

1 голос
/ 13 сентября 2011

У вас есть несколько вариантов, но

  • с использованием UNION между eve_member_list и eve_nonmember_member_list таблицей
  • и JOIN результаты этого UNION с вашей исходной eve_mining_op_members таблицей

вы получите требуемые результаты.

Оператор SQL

SELECT  lst.`characterID` 
        , lst.`name` 
FROM    `eve_mining_op_members` AS m
        INNER JOIN (
          SELECT  characterID
                  , name
          FROM    eve_member_list
          UNION ALL                  
          SELECT  characterID
                  , name
          FROM    eve_nonmember_member_list
        ) AS lst ON lst.characterID = m.characterID
WHERE op_id = '20110821105414-741653460';
1 голос
/ 13 сентября 2011

Вы можете попробовать левое объединение для обеих таблиц, а затем выбрать ненулевые результаты из результирующего запроса -

select * from
(select * from
  eve_mining_op_members as x
  left join eve_member_list  as y1 on x.characterID = y1.characterID
  left join eve_member_list2 as y2 on x.characterID = y2.characterID) as t
where t.name is not null

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

select * from
(select * from eve_mining_op_members as x
 inner join eve_member_list  as y1 on x.characterID = y1.characterID
  UNION
 select * from eve_mining_op_members as x
 inner join eve_member_list2 as y2 on x.characterID = y2.characterID) as t

Вы можете добавить свое op_id состояние, когда считаете нужным (извините, я не совсем понял, откуда оно). Удачи!

1 голос
/ 13 сентября 2011

Измените INNER JOIN на LEFT JOIN и объедините обе таблицы.Используйте IFNULL, чтобы выбрать имя, если оно появляется в первой таблице, но если оно равно NULL (поскольку совпадение не найдено), оно будет использовать значение, найденное во второй таблице.

SELECT
    characterID,
    IFNULL(eve_member_list.name, eve_nonmember_member_list.charName) AS name
FROM eve_mining_op_members
LEFT JOIN eve_member_list USING (characterID)
LEFT JOIN eve_nonmember_member_list USING (characterID)
WHERE op_id = '20110821105414-741653460';

Если у вас есть контроль над дизайном базы данных, вы должны также рассмотреть вопрос о том, возможно ли перестроить базу данных так, чтобы как члены, так и не члены сохранялись в одной таблице.Например, вы можете использовать логическое значение, чтобы указать, являются ли они членами.Или вы можете создать таблицу person и иметь информацию, относящуюся только к элементам, хранящимся в отдельной таблице memberinfo с обнуляемым внешним ключом от таблицы person до таблицы memberinfo.Это облегчит написание и выполнение запросов, относящихся как к членам, так и к не членам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...