Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql创建视图-筛选重复的行_Mysql_Sql_Sqlite_Sql View - Fatal编程技术网

mysql创建视图-筛选重复的行

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

我的用户被分成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  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用户处获取语言。如何做到这一点?如果某一种语言优先于另一种语言,或者你需要最新的语言,你需要决定你想要什么规则。。。