【问题标题】:MySQL: Merge tables, run SELECT and update duplicatesMySQL:合并表、运行 SELECT 并更新重复项
【发布时间】:2012-08-31 13:03:14
【问题描述】:

我有以下三个表:

表 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

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

选择表 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

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

【问题讨论】:

    标签: mysql sql merge duplicates


    【解决方案1】:

    试试这个:

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

    【讨论】:

    • 哇,很简单...我想到了复杂的连接操作^^ - 谢谢:)
    【解决方案2】:

    @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;
    

    【讨论】:

      猜你喜欢
      • 2012-12-22
      • 2012-07-15
      • 2021-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多