8

データベースの構築中にいくつかの問題が発生しました。2つの質問をします。

最初の質問:以下の表は同じIDでマージする必要があります

 ╔═════╦═══════╦═════╦═══════╗
 ║ id* ║ name  ║ age ║ grade ║
 ╠═════╬═══════╬═════╬═══════╣
 ║  0  ║ John  ║     ║       ║
 ║  0  ║       ║ 11  ║       ║
 ║  0  ║       ║     ║   6   ║
 ║  1  ║ Dave  ║     ║       ║
 ║  1  ║       ║ 12  ║       ║
 ║  1  ║       ║     ║   7   ║
 ╚═════╩═══════╩═════╩═══════╝

したがって、次のようになります。

 ╔═════╦═══════╦═════╦═══════╗
 ║ id* ║ name  ║ age ║ grade ║
 ╠═════╬═══════╬═════╬═══════╣
 ║  0  ║ John  ║ 11  ║   6   ║
 ║  0  ║ Dave  ║ 12  ║   7   ║
 ╚═════╩═══════╩═════╩═══════╝

注:id*はAUTO_INCREMENTではありません


2番目の質問:前者のデータベース構造は貧弱だと思うかもしれません。良い点は、データベースをまだ作成しておらず、古い情報を削除せずに既存の行にデータを追加するソリューションを探していましたが、古い情報がない場合は、新しい行が作成されます。前もって感謝します。

2番目の質問の説明

バージンテーブル

 ╔═════╦═══════╦═════╦═══════╗
 ║ id* ║ name  ║ age ║ grade ║
 ╠═════╬═══════╬═════╬═══════╣
 ║     ║       ║     ║       ║
 ╚═════╩═══════╩═════╩═══════╝

いくつかのSQLステートメント

 ╔═════╦═══════╦═════╦═══════╗
 ║ id* ║ name  ║ age ║ grade ║
 ╠═════╬═══════╬═════╬═══════╣
 ║  0  ║ John  ║     ║       ║
 ╚═════╩═══════╩═════╩═══════╝

異なるパラメーターを持つ同じSQLステートメント

 ╔═════╦═══════╦═════╦═══════╗
 ║ id* ║ name  ║ age ║ grade ║
 ╠═════╬═══════╬═════╬═══════╣
 ║  0  ║ John  ║     ║       ║
 ║  1  ║ Dave  ║     ║       ║
 ╚═════╩═══════╩═════╩═══════╝

別のSQLステートメント

 ╔═════╦═══════╦═════╦═══════╗
 ║ id* ║ name  ║ age ║ grade ║
 ╠═════╬═══════╬═════╬═══════╣
 ║  0  ║ John  ║     ║       ║
 ║  1  ║ Dave  ║ 12  ║       ║
 ╚═════╩═══════╩═════╩═══════╝

別のSQLステートメント

 ╔═════╦═══════╦═════╦═══════╗
 ║ id* ║ name  ║ age ║ grade ║
 ╠═════╬═══════╬═════╬═══════╣
 ║  0  ║ John  ║     ║   6   ║
 ║  1  ║ Dave  ║ 12  ║       ║
 ╚═════╩═══════╩═════╩═══════╝

... 等々。

4

2 に答える 2

17

すべての列に集計関数を適用してから、次のことができるはずですGROUP BY id

select id,
  max(name) name,
  max(age) age,
  max(grade) grade
from yourtable
group by id

デモで SQL Fiddle を参照してください

DB 構造に関する限り、私が目にする唯一の問題は、同じユーザーに対して複数のレコードを挿入していることです。UPDATE挿入する代わりに値を使用するには、ステートメントを使用する必要があります。

REPLACEMySQL で関数を使用したいようです( here is a tutorial )。

したがって、クエリは次のようになります。

REPLACE 
  INTO yourtable (`id`, `name`, `age`, `grade`) 
  VALUES (0, 'john', 11, null);

デモで SQL Fiddle を参照してください

于 2013-02-05T21:22:31.547 に答える
5

でグループ化しid、任意の集計関数を使用してnull以外の行を選択できます。この例ではを使用してmaxいますが、これminも機能します。

select  id
,       max(name) as name
,       max(age) as age
,       max(grade) as grade
from    YourTable
group by
        id
于 2013-02-05T21:21:42.150 に答える