MySQL:合并表,运行SELECT并更新重复项

时间:2012-09-06 16:43:54

标签: mysql sql merge duplicates

我有以下三个表:

表A:

id VARCHAR(32) | value VARCHAR(32) | groupId INT
abcdef         | myValue1          | 1
ghijkl         | myValue2          | 2
mnopqr         | myValue3          | 1

表B:

id VARCHAR(32) | value VARCHAR(32) | userId INT
abcdef         | myValue4          | 1
uvwxyz         | anotherValue      | 1

表C:

id VARCHAR(32) | someOtherColumns...
abcdef
ghijkl
mnopqr
...
uvwxyz

表A和B用于m:n关联,因此两个表中的“id”列引用相同的字段(表c中的“id” - 列)。 我想做的是(例如)...选择表A where groupId = 1

中的所有条目

SELECT * FROM TableA WHERE groupId = 1

并选择表B where userId = 1

中的所有条目
SELECT * FROM TableB WHERE userId = 1

这一切都没有问题......但是以下内容使得select语句变得困难:如何合并select-results并替换第一个结果的值?例如:

选择表A中的所有条目where groupId = 1我将获得abcdef和mnopqr。 当我选择表B中userId = 1的所有条目时,我也会得到abdef(另外还有uvwxyz)。

现在,表B中abcdef的值应该替换表A的选择结果中的值。并且应该将uvwxyz-entry添加到结果中。

最后,我正在寻找一个产生下表的查询:

id VARCHAR(32) | value VARCHAR(32)
abcdef         | myValue4           -- myValue1 from the select-statement in tableA should be overwritten
mnopqr         | myValue2           -- from table A
uvwxyz         | anotherValue       -- from table B

我希望有人知道怎么做...提前感谢任何建议!顺便说一句......如果有机会使用一个(长)选择语句来实现这一点,那就太好了。

2 个答案:

答案 0 :(得分:0)

试试这个:

SELECT * FROM TableB WHERE userId = 1
UNION
SELECT * FROM TableA WHERE groupId = 1 
       and id not in (select id from TableB where userid = 1)

答案 1 :(得分:0)

@rs指出使用UNION,这是必需的,因为MySQL没有FULL连接。

赞成表B中的数据是CASE的选择:

select id, case when max(value_b) is not null then max(value_b) else max(value_a) end as final_value
from (
    select id, value as 'value_a', null as 'value_b' from tableA
    union
    select id, null, value from tableB
) ugh
group by 1;