2010-07-12 53 views
0

我在我的數據庫中的兩個表:MySQL的幫助,使用重複的條目where子句

test1的,看起來像:

ID pubmed_ID 
------------------- 
1 22 
2 22 

test2的樣子:

antigen pubmed_ID 
------------------ 
Hello  22 
Bye  22 

當我使用以下選擇說明:

select * 
    from test1, test2 
where test1.pubmed_ID = test2.pubmed_ID; 

我得到:

ID pubmed_ID antigen pubmed_ID 
-------------------------------- 
1 22  Hello 22 
2 22  Hello 22 
1 22  Bye  22  
2 22  Bye  22 

爲什麼抗原被複制?當他們只在test2表中存在一次時?

主鍵如下TEST1 =「ID」欄和用於測試2兩者「抗原」和「pubmed_ID」形成複方主鍵

我缺少的東西簡單這裏嗎?

回答

2

因爲兩者都是匹配的。你期望它選擇哪一個?所有行都有相同的pubmed_ID。因此,test1的每一行匹配test2的每一行,因此在連接表中有四(2 * 2)行。

+0

我將如何選擇「雙」比賽? – Harpal 2010-07-12 02:49:47

+1

@Harpal,你想要哪一個? – 2010-07-12 02:50:34

+0

行1和行4請 – Harpal 2010-07-12 02:52:17

2

這是因爲根據加入標準,test2中的兩條記錄匹配test1中的每個記錄。

如果您希望它更具選擇性,您需要添加條件來過濾您的喜好。

+0

失敗的是,SELECT DISTINCT應該有所幫助。 – Kalium 2010-07-12 02:51:26

+0

@Kalium:根據示例中的數據,DISTINCT不會因爲ID值而有所幫助 - 它與其他每組值不同。 – 2010-07-12 02:54:01

+0

確實如此。那麼這就是直接的數據污染。 – Kalium 2010-07-12 02:54:55

1

您的加入正在運行。你匹配每個行相同的pumed_ID。

當DBE爭奪從表TEST1行1

ID pubmed_ID 
------------------- 
1 22 

,然後在表TEST2相同pubmed_ID,兩行相匹配匹配的行...

antigen pubmed_ID 
------------------ 
Hello  22 
Bye  22 

完全一樣的東西發生在表test1的第二行,使整個結果集包含四行。

有意義嗎?

0

很簡單,test1.ID = 1匹配,通過它的pubmed_ID Hello和Bye,以及其他test1記錄相同。