2016-03-31 9 views
1

特定のテーブルのレコードを処理するストアドプロシージャがあります。結合操作によって生成された結果を格納するには、一時表があります。分割された結果が行に設定されます

+----+------+--------+ 
| id | name | number | 
+----+------+--------+ 
| 1 | John | 123 | 
| 2 | Tim | 567 | 
| 3 | Bill | 789 | 
| 4 | Jim | 345 | 
+----+------+--------+ 

表B

+----+------+--------+ 
| id | code | number | 
+----+------+--------+ 
| 1 | LK | 123 | 
| 2 | CN | 123 | 
| 3 | BN | 789 | 
| 4 | IN | 345 | 
+----+------+--------+ 

表一時

+----+------+-----+------+--------+ 
| id | name | age | code | number | 
+----+------+-----+------+--------+ 
| 1 | John | 54 | LK | 123 | 
| 1 | John | 54 | CK | 123 | 
| 3 | Bill | 26 | BN | 789 | 
| 4 | Jim | 78 | IN | 345 | 
+----+------+-----+------+--------+ 

はJSONに設定されたテーブルの一時変換結果。

[{"id":1,"name":"John","code":"LK","number":123}, {"id":2,"name":"John","code":"CK","number":123}, {"id":3,"name":"Bill","code":"BN","number":789}, {"id":4,"name":"Jim","code":"IN","number":345}] 

以下のように表示するには、レコードを分割する必要があります。

+------------+-----+------+--------+ 
| name | age | code | number | 
+------------+-----+------+--------+ 
| John  | 54 |  |  | 
|   |  | LK | 123 | 
|   |  | CK | 123 | 
| Bill  | 26 |  |  | 
|   |  | BN | 789 | 
| Jim  | 78 |  |  | 
|   |  | IN | 345 | 
+------------+-----+------+--------+ 


[{"name":"John","age":54}, {"code":"LK","number":123}, {"code":"CK","number":123}, {"name":"Bill","age":26}, {"code":"BN","number":789}, {"name":"Jim","age":78}, {"code":"IN","number":345}] 

有効な方法は、JSONを分割するか、MySQLでテーブルTempをクエリすることによってそのような結果セットを生成することですか?

+0

あなたは、クライアント側で行う必要がありますすべては、id列を非表示にすることです「LEFT JOIN」....? – Rayon

答えて

1
-- query wanted 
select 
    if(name = @last_name, '', @last_name := name) as name, 
    if(age = @last_age, '', @last_age := age) as age, 
    code, 
    number 
from 
( 
    (select name, age, code, number from t) 
    union 
    (select distinct name, age, '', '' from t) 
    order by 1,2,3,4 
) as t2 cross join (select @last_name := null, @last_age := null) param; 

デモ:

SQL:

-- data 
create table t(id int, name char(20), age int, code char(20), number int); 
insert into t values 
( 1 , 'John' , 54 , 'LK' , 123), 
( 1 , 'John' , 54 , 'CK' , 123), 
( 3 , 'Bill' , 26 , 'BN' , 789), 
( 4 , 'Jim' , 78 , 'IN' , 345); 
select * from t; 

-- query wanted 
select 
    if(name = @last_name, '', @last_name := name) as name, 
    if(age = @last_age, '', @last_age := age) as age, 
    code, 
    number 
from 
( 
    (select name, age, code, number from t) 
    union 
    (select distinct name, age, '', '' from t) 
    order by 1,2,3,4 
) as t2 cross join (select @last_name := null, @last_age := null) param 
; 

出力:

mysql> select * from t; 
+------+------+------+------+--------+ 
| id | name | age | code | number | 
+------+------+------+------+--------+ 
| 1 | John | 54 | LK | 123 | 
| 1 | John | 54 | CK | 123 | 
| 3 | Bill | 26 | BN | 789 | 
| 4 | Jim | 78 | IN | 345 | 
+------+------+------+------+--------+ 
4 rows in set (0.00 sec) 

mysql> -- query wanted 
mysql> select 
    -> if(name = @last_name, '', @last_name := name) as name, 
    -> if(age = @last_age, '', @last_age := age) as age, 
    -> code, 
    -> number 
    -> from 
    -> (
    -> (select name, age, code, number from t) 
    -> union 
    -> (select distinct name, age, '', '' from t) 
    -> order by 1,2,3,4 
    ->) as t2 cross join (select @last_name := null, @last_age := null) param 
    -> ; 
+------+------+------+--------+ 
| name | age | code | number | 
+------+------+------+--------+ 
| Bill | 26 |  |  | 
|  |  | BN | 789 | 
| Jim | 78 |  |  | 
|  |  | IN | 345 | 
| John | 54 |  |  | 
|  |  | CK | 123 | 
|  |  | LK | 123 | 
+------+------+------+--------+ 
7 rows in set (0.00 sec) 
1

これは、出力質問の書式設定に似ているように思えます。データベースを照会するのではなく、このように出力を書式設定するためにjsをクライアント側で使用します。

私が本当にSQLを使いたいのであれば正直言って私は一時テーブルを使用しません。私はむしろ、ユニオンで2つの元のテーブルに基づいて別のクエリを作成し、最終的な結果セットを注文したいと思います。

(select id, name, age, null as code, null as number 
from a) 
union 
(select id, null, null, code, number 
from b) 
order by id asc, name desc 
関連する問題