mysql创建视图 - 过滤重复的行

时间:2013-01-08 09:24:13

标签: mysql sql sqlite sql-view

我的用户在5个数据库的用户表中被分割。看起来像这样:

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。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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_update。