2011-06-22 18 views
1

私は、私が参加する必要がある2つのテーブルがあります。これらは次のとおりである:mysql join query

  • art

    id | art 
    -------- 
    1 | A 
    2 | B 
    3 | C 
    4 | D 
    5 | E 
    6 | F 
    7 | G 
    8 | H 
    9 | I 
    

  • Sess

    artid | sessid 
    -------------- 
    1  | 1 
    2  | 1 
    3  | 1 
    4  | 1 
    1  | 2 
    4  | 2 
    5  | 2 
    6  | 2 
    1  | 3 
    2  | 3 
    7  | 3 
    4  | 3 
    

Sess.artidが012にforeginの鍵です。

上記の表から、A,B,C,D,A,D,E,FおよびA,B,G,Dの3つのセッションがあることがわかります。 私は、アートAに沿って発生する芸術のランキングを取得したい。何かのように:

D=3 
B=2 

私はどのようにこのようなクエリをmysqlまたはpostgresに作成できますか?

答えて

2

にクエリを結合します。 次に、フィルタ句のアーティクルと一度だけ結合し、もう1回、他のセッションの他のアーティクルの名前を取得します。

SELECT aSameSession.art, count(*) 
FROM art a 
    INNER JOIN Sess s 
     ON a.id = s.artid 
    INNER JOIN Sess sSameArticle 
      ON sSameArticle.sessid = s.sessid 
    INNER JOIN art aSameSession 
     ON sSameArticle.artid = aSameSession.id 
WHERE A.art = 'A' 
AND aSameSession.art <> 'A' 
GROUP BY aSameSession.art 

出力:

B 2 
C 1 
D 3 
E 1 
F 1 
G 1 

このバージョンでは、単にはるかに簡単である物品のIDとバージョンので、ここでは、理解することは少し難しいかもしれない:

SELECT sSameArticle.artid, count(*) 
FROM Sess s 
    INNER JOIN Sess sSameArticle 
     ON sSameArticle.sessid = s.sessid 
WHERE s.artid = 1 
AND sSameArticle.artid != 1 
GROUP BY sSameArticle.artid 

出力:

2 2 
3 1 
4 3 
5 1 
6 1 
7 1 

記事の名前を追加するだけで化粧です。

+0

ありがとうScorpi0。あなたの質問は順調に進んでいるようです。しかし、私はそれが私が望むように動作するように管理していない。私は何か間違っているかもしれない。あなたが書いたように入れ子にされた結合を含めるべきですか? – Sfairas

+0

出力はありますか?あなたは私のように内部結合インデントを書く必要はありません。私は空の結果セットを取得怒鳴るクエリを実行することにより –

+0

: SELECT aSameSession.artは、COUNT(*)の記事FROMランク ASを INNERはa.id = s.artid ONセッション数秒 のJOIN INNERが芸術aSameSession を登録しようON s.artid = aSameSession.id ここでa.art = 'A' AND aSameSession.art!= 'A' GROUP BY aSameSession.art – Sfairas

0
SELECT a.art, count(*) as ranking 
FROM art a, sess s 
WHERE a.id = s.artid 
group by a.art 
order by count(*) DESC; 

ANSI-92構文のステートメントは、Konerakの答えを見てください。おそらく、このような

+1

これは正しいですが、古いANSI-89構文の代わりに[ANSI-92構文]を教えてください(http://stackoverflow.com/questions/334201/why-isnt-sql-ansi-92-standard-よりよく採用された-89以上)。 – Konerak

+0

あなたはそうです。私はANSI-89を使用する傾向があります。しかし、それはたぶん私が習慣の生き物だからです。 ANSI-92構文を使用する良い理由があります。だから+1 :-) –

2

何か、:

select art,count(*) 
from sessid 
    left join art on art.id=artid 
where sessid in (select sessid from sess where artid=1) 
group by artid; 

+0

ありがとう!それは私が必要としているように正確に働いた! – Sfairas

+1

@Sfairasまさにあなたが必要としていたときに、答えを受け入れてください! –

+0

これはMySQLでは動作しますが、Postgresについてはわかりません。 Scorpi0の答えが良いと思う。 –

0

テーブル構造の例とあなたは同じセッションを共有する記事を取得するために二回セッションテーブルに参加する必要があるPostgreSQLの

CREATE TABLE arts (
    arts_id serial PRIMARY KEY, 
    name text NOT NULL 
); 

CREATE TABLE sessions (
    sessions_id integer NOT NULL, 
    arts_id integer NOT NULL REFERENCES arts 
); 


SELECT arts.name, count(sessions_id) 
FROM arts 
JOIN sessions USING (arts_id) 
GROUP BY arts.name 
ORDER BY count(sessions_id) DESC;