MySQL的表连接选择
我有2个表:MySQL的表连接选择
- 话题(ID,标题)
- 解答(ID,
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