MySQL的表连接选择

问题描述:

我有2个表:MySQL的表连接选择

  • 话题(ID,标题)
  • 解答(ID,id_topicid_user,答案)

...,我想做一个选择来检测属于一个用户的所有问题。

我试图做一个连接,但这不起作用,因为如果用户回答了一个话题两次,它将返回2个具有相同主题的行。我试图做一个SELECT DISTINCT,但也失败了。

+1

通过'问题'你是指主题,或主题和答案的组合?有一个单独的用户表?更多信息。 – 2009-09-29 01:04:58

尝试:

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

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