如何进行mysql连接,其中连接可能来自一个或另一个表

时间:2011-09-13 06:15:43

标签: mysql join

这是我用来将成员名称与id匹配的查询。

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.characterIDcharName的匹配项}

如果这个问题难以理解,我会提前道歉,因为我不太清楚如何正确地询问我在寻找什么。

3 个答案:

答案 0 :(得分:1)

将您的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表的可空外键表。这将使与成员和非成员相关的查询更容易编写和更好地执行。

答案 1 :(得分:1)

您可以通过

选择多个选项
  • UNIONeve_member_list表格
  • 之间使用eve_nonmember_member_list
  • JOINUNION与原始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';

答案 2 :(得分:1)

您可以在两个表上尝试左连接,然后从生成的查询中选择非空结果 -

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

或者,您可以尝试使用union并使用内部联接(假设连接表相同):

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条件下投掷(抱歉,我真的不明白它来自哪里)。祝你好运!