我有2個表:MySQL的表連接選擇
- 話題(ID,標題)
- 解答(ID,
id_topic
,id_user
,答案)
...,我想做一個選擇來檢測屬於一個用戶的所有問題。
我試圖做一個連接,但這不起作用,因爲如果用戶回答了一個話題兩次,它將返回2個具有相同主題的行。我試圖做一個SELECT DISTINCT,但也失敗了。
我有2個表:MySQL的表連接選擇
id_topic
,id_user
,答案)...,我想做一個選擇來檢測屬於一個用戶的所有問題。
我試圖做一個連接,但這不起作用,因爲如果用戶回答了一個話題兩次,它將返回2個具有相同主題的行。我試圖做一個SELECT DISTINCT,但也失敗了。
嘗試:
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。
我希望人們不要因爲以前缺乏對子查詢的支持而停止對MySQL的使用。 MySQL現在支持子查詢將近五年*(自2004-10-23以來)。 4.1版引入了對子查詢的支持,現在已經很老了,它今年將達到其使用壽命(2009-12-31)。請參閱http://www.mysql.com/about/legal/lifecycle/。 – 2009-09-29 01:39:19
沒有冒犯的意思,並不意味着「豎琴」,只是說明部署的MySQL實例存在不支持我給出的答案。 – 2009-09-29 15:04:40
夠公平的。是的,我同意MySQL 4.1仍然是一些虛擬主機提供商支持的唯一版本。同樣,有些人仍然使用Microsoft SQL Server 2000或Oracle 8。 – 2009-09-29 16:20:14
SELECT * FROM topics
WHERE id IN (SELECT id_topic FROM answers WHERE id_user = ?);
如果某些值由子查詢返回多次,則無關緊要。外部查詢中的任何給定行將匹配或不匹配。
就像E. F. Codd所說的,「如果某件事情是真的,那麼說兩遍並不會使它更真實。」
如果你想看到用戶回答哪些主題,試試這個:
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
。
通過'問題'你是指主題,或主題和答案的組合?有一個單獨的用戶表?更多信息。 – 2009-09-29 01:04:58