2015-04-16 14 views
0

我有一個模型很差的數據庫,並且有兩個表(groupownergroupmembers)具有幾乎相同的數據。我想創建一個視圖,將它們組合起來並按用戶分組。MySQL查詢將兩個表連接在一起,並獲得組合數據的一行

用下面的查詢......

SELECT 'group' AS resourceType, gm.gid AS resource_id, gm.personid AS account_id, false AS isManager, true AS isMember 
FROM data.groupmembers gm 
    UNION 
SELECT 'group' AS resourceType, gn.gid AS resource_id, gn.owner AS account_id, true AS isManager, false AS isMember 
FROM data.groupowner gn 
    ORDER BY resource_id ASC, account_id ASC; 

...我得到的是這樣的:

resourceType | resource_id | account_id | isManager | isMember 
------------ | ----------- | ---------- | --------- | -------- 
group  | 105   | 506  | 1   | 0 
group  | 105   | 506  | 0   | 1 
etc... 

..when我想是這樣(這兩個表合併,或一個或另一個):

resourceType | resource_id | account_id | isManager | isMember 
------------ | ----------- | ---------- | --------- | -------- 
group  | 105   | 506  | 1   | 1 
etc... 

有什麼辦法可以用MySQL查詢來實現這個嗎?

+1

做一個GROUP BY對工會的結果,MAX。 – jarlh

+0

@jarlh - 哇,好的,那完全正確。對我來說,這是一個「唔」的時刻。工作很好。 – caseyamcl

+0

很高興聽到它的工作! – jarlh

回答

1

我想你想要一個join而不是union all。假設所有的業主成員,這應該工作是「視圖」兼容MySQL中:

SELECT 'group' AS resourceType, gm.gid AS resource_id, gm.personid AS account_id, 
     (gn.personid is not null) AS isManager, true AS isMember 
FROM data.groupmembers gm LEFT JOIN 
    data.groupowner gn 
    ON gm.gid = gn.gid and 
     gm.personid = gn.personid; 

另一種方法是使用相關子查詢:

select gm.*, 
     (exists (select 1 
       from data.groupowner gn 
       where gm.gid = gn.gid and gm.personid = gn.personid 
     ) as IsManager 
from data.groupmembers; 

如果業主成員,我米不知道爲什麼你需要「isMember」列。

編輯:

如果業主不成員,那麼你獲得視圖兼容邏輯是一個挑戰。但是,這應該工作:

SELECT 'group' AS resourceType, gm.gid AS resource_id, gm.personid AS account_id, 
     (gn.personid is not null) AS isManager, true AS isMember 
FROM data.groupmembers gm LEFT JOIN 
    data.groupowner gn 
    ON gm.gid = gn.gid and 
     gm.personid = gn.personid 
UNION ALL 
SELECT 'group', gn.gid, gn.personid, 
     true, false 
FROM data.groupowner gn 
WHERE NOT EXISTS (SELECT 1 
        FROM data.groupmembers 
        WHERE gm.gid = gn.gid and gm.personid = gn.personid 
       ); 
+0

非常感謝,但不幸的是,這種假設是不正確的(數據確實模型很差!)。有時候經理不是會員,反之亦然...... – caseyamcl

+0

是的,我只是嘗試了一個子查詢,並瞭解到他們不允許在MySQL視圖中使用。不過,你的編輯工作像冠軍。謝謝您的幫助! – caseyamcl

+0

@caseyamcl。 。 。確切地說,子查詢不允許在MySQL視圖的'from'子句中。它們被允許在'select'和'where'子句中。 –

0

嘗試在IsManager的和isMember使用下面的查詢慾望輸出

SELECT resourceType, resource_id, account_id, sum(isManager), sum(isMember) from 
(SELECT 'group' AS resourceType, gm.gid AS resource_id, gm.personid AS account_id, 0 AS isManager, 1 AS isMember 
FROM data.groupmembers gm 
    UNION 
SELECT 'group' AS resourceType, gn.gid AS resource_id, gn.owner AS account_id, 1 AS isManager, 0 AS isMember 
FROM data.groupowner gn 
    ORDER BY resource_id ASC, account_id ASC) temp 
group by resource_id, account_id; 
+0

我嘗試了一些非常相似的東西,它很有效,但不幸的是,您無法從子查詢創建視圖。 – caseyamcl

+0

正確MySQL的限制是不能從包含子查詢的select語句創建視圖。如果爲子查詢創建一個視圖,然後使用此視圖創建最初想要的視圖,則可以輕鬆克服此限制。所以你將不得不創建2個視圖。 –

相關問題