0

以下は、私がテーブルを持っている方法です。

create table tab1 ( id int, myname varchar(20));

insert into tab1 values 
(1, 'name 1'),
(2, 'name 2');

create table tab2 ( id int, tab2id int, type varchar(20), value varchar(20));
insert into tab2 values
(1,1,'phone','12345671'),
(1,2,'location','location 1'),
(2,3,'phone','12345672'),
(2,4,'location','location 2');

私が欲しいのは以下の通りです。

myname   |   phone    | location  
 name 1  |  12345671  | location 1
 name 2  |  12345672  | location 2

これを行う方法はありますか?

クエリをチェックするためのダミーデータ

4

5 に答える 5

1
select x.myname as name, a.value as Phone, b.value as Location
from tab1 x,
(select value, id
from tab2 
where type='phone' 
group by id)a,
(select value, id
from tab2 
where type='location' 
group by id)b
where x.id = a.id
and x.id = b.id;

ここでSQL フィドル

于 2012-10-10T08:40:58.447 に答える
0

これを試して:

select * from 
(select (select myname from tab1 where id=t1.id) myname,CASE WHEN t1.type='phone' then t1.value end as 'Phone', (select value from tab2 where id=t1.id and type='location') 'Location'
from tab2 t1) a where phone is not null 

SQL フィドルのデモ

于 2012-10-10T08:46:11.500 に答える
0
select t1.myname,t2.value as phone,t3.value as location from tab1 t1 
inner join tab2 t2 on t1.id=t2.id and t2.type='phone' 
inner join tab2 t3 on t1.id=t3.id and t3.type='location' 

ここ のSQL FIDDLE http://sqlfiddle.com/#!2/16112/6

于 2012-10-10T08:23:22.820 に答える
0

diEcho が提案したようにテーブル構造を変更することをお勧めしますが、あなたの場合は次のクエリ (ピボット テーブル) を使用できます。このクエリを実行し、最初のテーブルと結合してみてください -

SELECT
  id,
  MAX(IF(type = 'phone', value, NULL)) phone,
  MAX(IF(type = 'location', value, NULL)) location
FROM
  tab2
GROUP BY
  id
于 2012-10-10T08:35:19.573 に答える
0

気にしないで、私はここから離れています....

これを試してください:

select tab1.id, tab1.myname, tab2.type, tab2.value from tab1 join tab2 on tab1.id=tab2.id 
JOIN tab2 as t2 ON tab1.id=tab2.id WHERE t2.tab2id=2;

http://sqlfiddle.com/#!2/80d02/7

于 2012-10-10T08:23:50.647 に答える