2011-06-22 139 views
1

我有兩個表,我需要加入。它們是:mysql連接查詢

  • 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是foregin關鍵art.id

從上表我們可以看到,有3個會話:A,B,C,D,A,D,E,FA,B,G,D。 我想獲得與藝術A一起出現的藝術排名。例如:

D=3 
B=2 

如何在mysql或postgres中形成這樣的查詢?

回答

2

你需要加入兩倍的會話表來獲取文章共享相同的會話查詢。 然後加入一次與過濾條款的文章,另一次在另一個會話中獲取另一篇文章的名稱。

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(*)AS級別 從文章的一個 INNER JOIN SESS小號 ON a.id = s.artid INNER JOIN藝術aSameSession ON s.artid = aSameSession.id WHERE 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-92語法而不是舊的ANSI-89語法](http://stackoverflow.com/questions/334201/why-isnt-sql-ansi-92-standard-更好地採用的環比ANSI-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;