SQL查询(无重复连接)

时间:2016-05-11 07:20:22

标签: sql postgresql having

我有表userstopics。每个用户可以拥有0到多个主题(一对多关系)。

我如何只获得至少有一个主题的用户?

我需要来自用户的所有列(不包含主题中的列),并且不需要表users中的重复项。在上一篇专栏文章中,我需要多少主题。

更新:

应该是这样的:

SELECT user.*, count(topic.id) 
FROM ad
LEFT JOIN topic ON user.id = topic.ad
GROUP BY user.id
HAVING count(topic.id) > 0;

但结果为0。但它不应该是0。

4 个答案:

答案 0 :(得分:5)

首先你需要有两个表,因为你已经留下了有关你的表结构的有限信息我会用一个例子解释它是如何工作的,你应该可以轻松地将它应用到你自己的表中。

首先,您需要有两个表(您可以这样做)

表"用户"

id | name
1  | Joe Bloggs
2  | Eddy Ready

表"主题"

topicid | userid | topic
      1 |      1 | Breakfast
      2 |      1 | Lunch
      3 |      1 | Dinner

现在要求对每个用户进行计数是使用以下内容完成的;

SELECT user.name, count(topic.topicid) 
FROM user
INNER JOIN topic ON user.id = topic.userid
GROUP BY user.name

如果您使用左连接,则会包含来自"用户"的记录。在"主题"中没有任何行的表table,但是如果你使用INNER JOIN,那么它只包含两个表中具有匹配值的用户。

即。因为用户ID" 2" (我们用来加入)未列在主题表中,您将无法获得此用户的任何结果。

希望有所帮助!

答案 1 :(得分:0)

使用内连接和不同

select distinct user_table.id
from user_table 
inner join topics_table on topic_table.user_id = user_table.id

答案 2 :(得分:0)

JSON.stringify

答案 3 :(得分:0)

您可以为每个用户选择主题编号,然后将其与用户数据相关联。像这样:

with t as
(
select userid, count(*) as n
from topic
group by userid
)
SELECT user.*, t.n
FROM user
JOIN t ON user.id = t.userid