2013-01-08 56 views
0

我的用戶在5個數據庫的用戶表中分裂。看起來是這樣的:mysql創建視圖 - 過濾器重複行

db1.user 
id token app lang last_update 
XX 1  a en 11:00 
XX 2  a en 12:00 


db2.user 
id token app lang last_update 
XX 1  b en 12:00 
XX 2  a en 16:00 

db3.user 
… 

現在我需要在一個視圖中的所有用戶,它應該是這樣的(令牌和應用在一起的主鍵):

view db.user_all 
id token app lang last_update 
XX 1  a en 11:00 
XX 1  b en 12:00 
XX 2  a en 16:00 

我試圖工會一切:

create view `db`.`user_all` AS 
SELECT * FROM `db1`.`user` union 
SELECT * FROM `db2`.`user` 

結果看起來是這樣的:

view db.user_all 
id token app lang last_update 
XX 1  a en 11:00 
XX 2  a en 12:00 
XX 1  b en 12:00 
XX 2  a en 16:00 

我的sql語句刪除重複的行,但如果last_update不同,我在結果視圖中得到了一個重複的用戶。如何解決這個問題?我需要所有的數據,也是最新的last_update。

+0

您如何識別我們的用戶?通過'id'列? – Shubhansh

+0

在同一個數據庫中,用戶具有相同的ID,但不在第二個數據庫中...那裏應該是令牌和應用列 – jens

回答

0

試試這個:

CREATE VIEW user_intermediate AS 
SELECT * FROM db1 UNION ALL SELECT * FROM db2 
ORDER BY last_update DESC 
; 

CREATE VIEW user_all AS 
SELECT * 
FROM user_intermediate 
GROUP BY app, token 
; 

假設App和Token創建用戶密鑰,那麼user_all視圖應該包含具有最新last_u的不同用戶跨兩個表更新。

0

嘗試使用DISTINCT連同MAX,所以是這樣的:

SELECT DISTINCT id, token, app, lang, max(last_update) FROM (
    SELECT * FROM `db1`.`user` union 
    SELECT * FROM `db2`.`user` 
) 
GROUP BY id, token, app, lang 

您可能需要最後的支架後使用的別名。


更新

顯然,MYSQL不能有意見子查詢,所以你必須創建這個作爲一個存儲過程,而不是http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html

+0

它說:#1349 - 視圖的SELECT包含FROM子句中的子查詢 – jens

+0

已更新的答案。 – twoleggedhorse

+0

如果我創建第二個臨時視圖,它幾乎是相同的?一個用於子查詢?如果同一個用戶的「lang」不同,我也想從max(last_update)用戶那裏得到「lang」。如何達到這個? – jens