这是我用来将成员名称与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.characterID
与charName
的匹配项}
如果这个问题难以理解,我会提前道歉,因为我不太清楚如何正确地询问我在寻找什么。
答案 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)
您可以通过
选择多个选项UNION
和eve_member_list
表格eve_nonmember_member_list
JOIN
此UNION
与原始eve_mining_op_members
表的结果您将获得所需的结果。
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
条件下投掷(抱歉,我真的不明白它来自哪里)。祝你好运!