我有以下三个表:
表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
我希望有人知道怎么做...提前感谢任何建议!顺便说一句......如果有机会使用一个(长)选择语句来实现这一点,那就太好了。
答案 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;