mysql创建视图-筛选重复的行
我的用户被分成5个数据库的用户表。看起来像这样:mysql创建视图-筛选重复的行,mysql,sql,sqlite,sql-view,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
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 2 a en 12:00
XX 1 b en 12:00
XX 2 a en 16:00
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
现在我需要所有用户都在一个视图中,看起来这个令牌和应用程序是主键:
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`
结果如下所示:
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 2 a en 12:00
XX 1 b en 12:00
XX 2 a en 16:00
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
我的sql语句删除了重复的行,但是如果上次更新不同,我在结果视图中得到了一个重复的用户。如何解决这个问题?我需要所有数据,以及最新的上次更新。尝试使用DISTINCT和MAX,如下所示:
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 2 a en 12:00
XX 1 b en 12:00
XX 2 a en 16:00
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不能在视图中包含子查询,因此您必须将其创建为存储过程,而不是尝试使用DISTINCT和MAX,例如:
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 2 a en 12:00
XX 1 b en 12:00
XX 2 a en 16:00
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不能在视图中包含子查询,因此您必须将其创建为存储过程
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
;
假设应用程序和令牌为用户密钥,则“用户所有”视图应包含两个表中具有最新上次更新的不同用户。尝试以下操作:
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
;
假设应用程序和令牌为用户密钥,则“用户所有”视图应在两个表中包含具有最新上次更新的不同用户。您如何识别我们的用户?通过id列?在同一数据库中,用户具有相同的id,但不在第二个数据库中。。。这应该是令牌和应用程序列。您如何识别我们的用户?通过id列?在同一数据库中,用户具有相同的id,但不在第二个数据库中。。。这应该是token和app列,它说:1349-View的SELECT在FROM子句中包含一个子查询,如果我创建第二个临时视图,它几乎是一样的?一个用于子查询?如果同一用户之间的语言不同,我还希望从maxlast_update用户处获取语言。如何做到这一点?你需要决定你想要什么规则,如果某一种语言优先于另一种语言,或者你需要最新的…它说:1349-视图的SELECT在FROM子句中包含一个子查询如果我创建第二个临时视图,这几乎是一样的?一个用于子查询?如果同一用户之间的语言不同,我还希望从maxlast_update用户处获取语言。如何做到这一点?如果某一种语言优先于另一种语言,或者你需要最新的语言,你需要决定你想要什么规则。。。