1

我的用户分布在 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。

4

2 回答 2

1

试试这个:

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 的不同用户。

于 2013-01-08T18:36:39.977 回答
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

于 2013-01-08T13:31:08.173 回答