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
…

すべてのユーザーが 1 つのビューに表示されるようになりました。次のようになります (トークンとアプリが主キーになります)。

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 に答える