3

次の定義を持つ3つのテーブルがあります

people
------
- wid 
- name

types
-----
- guid
- type

mapping
-------
- guid
- wid

people テーブルには人のリストがあります

タイプ テーブルには、 people テーブルに存在する各行のタイプ情報が含まれます。人物が複数のタイプに属している場合、タイプ テーブルには 2 つの行が存在します。

マッピング テーブルは、人テーブルとタイプ テーブルの間のマッピングを提供します。

ここで、「政治家」タイプの人を調べるには、次のクエリを使用できます。

select name from people inner join 
(mapping inner join types on mapping.guid = types.guid) 
on people.wpid = mapping.wpid where types.type = 'politician'

しかし今、私は政治家が属する他のタイプが何であるかを知りたいと思っています. group byandhaving句を使用する必要があることはわかっています。しかし、私はクエリを思いつくことができません。このクエリの書き方

4

2 に答える 2

2

値のグループに対する集計関数の結果を得るには、group by を使用する必要があります (さまざまなタイプのカウントや値の合計を受け取るなど)。人々が属するタイプのグループも取得する必要がある場合は、このような単一のクエリを使用できます。

select name, types
from people inner join 
(mapping inner join types on mapping.guid = types.guid) 
on people.wpid = mapping.wpid
where people.wpid in (select people.wpid from people inner join 
(mapping inner join types on mapping.guid = types.guid) 
on people.wpid = mapping.wpid where types.type = 'politician')

group by は、政治家が所属しているグループの数を知るのに役立ちます

select name, count(types)
from people inner join 
(mapping inner join types on mapping.guid = types.guid) 
on people.wpid = mapping.wpid
where people.wpid in (select people.wpid from people inner join 
(mapping inner join types on mapping.guid = types.guid) 
on people.wpid = mapping.wpid where types.type = 'politician')
group by name

編集: IN サブクエリを避ける

政治家グループのギルドを知っていれば、このようなことができます。私はクエリをテストしませんでしたが、アイデアは、guid が政治家の GUID と等しいマッピングテーブルとの結合を使用してpeopleテーブルをフィルタリングすることです。

select p.name, count(t.types)
from people p inner join mapping m1
on p.wid = m1.wid and m1.guid = [politician guid]
inner join mapping m2
on p.wid = m2.wid
inner join types t
in m2.guid = t.guid
于 2012-11-12T13:45:29.393 に答える
2

試す:

select p.name, t2.type
from types t1
join mapping m1 on m1.guid = t1.guid
join people p on p.wpid = m1.wpid 
join mapping m2 on p.wpid = m2.wpid 
join types t2 on m2.guid = t2.guid
where t1.type = 'politician'
order by 1, 2

- すべての政治家と彼らが属するすべてのタイプのリスト。

または、すべての政治家のリストと、政治家が属するさまざまなタイプの数だけが必要な場合は、次を試してください。

select p.name, count(*)
from mapping m1
join people p on p.wpid = m1.wpid 
join mapping m2 on p.wpid = m2.wpid 
where m1.guid = 1 /* replace 1 with appropriate guid for politicians */
group by p.name
order by 1
于 2012-11-12T14:01:37.680 に答える