2009-09-29 88 views
0

我有2個表:MySQL的表連接選擇

  • 話題(ID,標題)
  • 解答(ID,id_topicid_user,答案)

...,我想做一個選擇來檢測屬於一個用戶的所有問題。

我試圖做一個連接,但這不起作用,因爲如果用戶回答了一個話題兩次,它將返回2個具有相同主題的行。我試圖做一個SELECT DISTINCT,但也失敗了。

+1

通過'問題'你是指主題,或主題和答案的組合?有一個單獨的用戶表?更多信息。 – 2009-09-29 01:04:58

回答

1

嘗試:

SELECT id, topic 
    FROM topics 
WHERE id IN (SELECT id_topic 
       FROM answers 
       WHERE id_user = <USERID>) 

...或:

SELECT id, topic 
    FROM topics 
WHERE EXISTS (SELECT * 
       FROM answers 
       WHERE id_user = topics.id) 

...,並根據您的索引方案測試性能。僅限最新版本的MySQL。

+1

我希望人們不要因爲以前缺乏對子查詢的支持而停止對MySQL的使用。 MySQL現在支持子查詢將近五年*(自2004-10-23以來)。 4.1版引入了對子查詢的支持,現在已經很老了,它今年將達到其使用壽命(2009-12-31)。請參閱http://www.mysql.com/about/legal/lifecycle/。 – 2009-09-29 01:39:19

+0

沒有冒犯的意思,並不意味着「豎琴」,只是說明部署的MySQL實例存在不支持我給出的答案。 – 2009-09-29 15:04:40

+0

夠公平的。是的,我同意MySQL 4.1仍然是一些虛擬主機提供商支持的唯一版本。同樣,有些人仍然使用Microsoft SQL Server 2000或Oracle 8。 – 2009-09-29 16:20:14

0
SELECT * FROM topics 
WHERE id IN (SELECT id_topic FROM answers WHERE id_user = ?); 

如果某些值由子查詢返回多次,則無關緊要。外部查詢中的任何給定行將匹配或不匹配。

就像E. F. Codd所說的,「如果某件事情是真的,那麼說兩遍並不會使它更真實。」

0

如果你想看到用戶回答哪些主題,試試這個:

SELECT t.title, a.id_user, COUNT(a.id) 
FROM topics t LEFT JOIN answers a 
    ON (t.id=a.topic_id) 
GROUP BY t.title, a.id_user; 

上述會給你從用戶(如果有的話)的答案的標題,用戶和號碼。如果您只想回答主題,請使用JOIN而不是LEFT JOIN