2012-10-24 15 views
2

這是我的表:加入三個表期待的結果,但結果是錯誤的

user table: 
id..|..fname 
1...|..dan 
2...|..den 

trans table: 
.transid.|..userid....|..adid.....|..click 
.....1...|....1.......|.....1.....|.....1 
.....2...|....2.......|.....1.....|.....1 

ads table: 
id..|..adname 
1...|..sample 

我的SELECT子句是:

select u.fname, 
     t.click 
from user u 
    inner join ads a on u.id=a.id 
    inner join trans t on a.id=t.transid 
order by u.fname; 

我期待的

fname....|..click 
dan......|...1... 
den......|...1... 
結果

但結果是錯誤的,它只顯示第一行。這裏有什麼可能是錯的?

+0

從昨天開始與[Sky Scraper](http://stackoverflow.com/users/1643065/sky-scraper)沒有任何關係? – Kermit

+0

歡迎來到SO。請注意格式化您的問題,否則它只會爲其他人創建工作 - 謝謝。 – halfer

+1

您只會收到一行,因爲您在廣告表中沒有針對書房的條目。 – DaveRlz

回答

1

你只需加入以錯誤的順序表,等等錯誤的領域。

您查詢......

select u.fname, t.click 
from user u 
inner join ads a on u.id=a.id 
inner join trans t on a.id=t.transid 
order by u.fname; 

您加入usersads其中aduser具有相同的id

然後你加入到trans表中,其中adtrans共享相同的id

這些都沒有意義。


你應該加入usertrans表,其中有一個userid場。

而且您還應該加入adstrans表,其中有adid字段。

SELECT 
    u.fname, 
    a.click 
FROM 
    user 
INNER JOIN 
    trans 
    ON trans.userid = user.id 
INNER JOIN 
    ads 
    ON ads.id = trans.adid 
+0

是的,如果他沒有使用命名字段ID的反模式,他就不會有問題。然後他會知道哪些提交的聯合。 – HLGEM

+1

@HLGEM - 我不同意。如果使用模式'id'而不是'

_id',則***從不適合加入'ON a.id = b.id'。這至少涵蓋了第一次錯誤的加入。而且,對我而言,看到「打開一個.id.transid」幾乎是一個明顯的錯誤。使用'id'的好處在於它暗示這是表的唯一標識符(或代理唯一標識符),而不是* foriegn密鑰。我強烈地認爲這是一種偏好/地方標準的選擇。 – MatBailie

+0

我建議你閱讀有關SQL反模式的書。 http://www.amazon.com/SQL-Antipatterns-Programming-Pragmatic-Programmers/dp/1934356557/ref=sr_1_1?s=books&ie=UTF8&qid=1351091291&sr=1-1&keywords=sql+antipatterns – HLGEM

3

這可以通過僅連接兩個表來實現:transuser

SELECT b.fname, a.click 
FROM trans a 
     INNER JOIN user b 
      ON a.userid = b.id 

SQLFiddle Demo

其他明智的,如果你想訪問表ads以及通過使用INNER JOIN

SELECT b.fname, a.click, c.adname 
FROM trans a 
     INNER JOIN user b 
      ON a.userid = b.id 
     LEFT JOIN ads c 
      ON a.adid = c.id 

SQLFiddle Demo

+0

這應該工作,除非他已經簡化查詢 – HLGEM

+0

@HLGEM是,這是正常的:)簡化爲清晰(*有時導致誤解*) –

1

加入它,我想你想以下幾點:

select u.fname, t.click 
from user u 
left join trans t 
    on u.id=t.transid 
left join ads a 
    on t.adid = a.id 
order by u.fname; 

SQL Fiddle with Demo

+0

我不認爲ad.Id和U.id指的是同樣的事情。 – HLGEM

+0

@HLGEM你是對的,刪除該查詢。 – Taryn

1

你想在trans表先加入,因爲它有相互關係user

SELECT u.fname, t.click 
FROM trans t 
     INNER JOIN user u 
       ON u.id = t.userid 
ORDER BY u.fname; 
+1

看到這個混亂是爲什麼使用ID作爲名稱是反模式。 – HLGEM