【问题标题】:How to pull the count of occurences from 2 SQL tables如何从 2 个 SQL 表中提取出现次数
【发布时间】:2021-03-01 04:26:48
【问题描述】:

我在我创建的 SQlite3 数据库上使用 python。我已经创建了数据库,目前只是使用命令行来尝试正确获取 sql 语句。

我有 2 张桌子。

Table 1 - users
user_id, name, message_count

Table 2 - messages
id, date, message, user_id

当我设置表 2 时,我在创建消息表时添加了此语句,但我不知道它做了什么(如果有的话):

FOREIGN KEY (user_id) REFERENCES users (user_id)

我要做的是返回一个包含 2020 年期间的姓名和消息数的列表。我已经使用此语句来获取 2020 年的帖子总数,并且它有效:

SELECT COUNT(*) FROM messages WHERE substr(date,1,4)='2020';

但我正在努力弄清楚我是否应该加入表格,或者是否有办法只提取我需要的信息。我想要的语句看起来像这样:

SELECT name, COUNT(*) FROM users JOIN messages ON messages.user_id = users.user_id WHERE substr(date,1,4)='2020';

【问题讨论】:

  • 当您在结果集中有多个表中的数据时,通常推荐使用join

标签: sql sqlite count subquery left-join


【解决方案1】:

一个选项使用相关子查询:

select u.*,
    (
        select count(*) 
        from messages m 
        where m.user_id = u.user_id and m.date >= '2020-01-01' and m.date < '2021-01-01'
    ) as cnt_messages
from users u

此查询将利用messages(user_id, date) 上的索引。 你也可以join 和聚合。如果您想允许没有消息的用户,left join 是合适的:

select u.name, count(m.user_id) as cnt_messages
from users u
left join messages m 
    on m.user_id = u.user_id and m.date >= '2020-01-01' and m.date < '2021-01-01'
group by u.user_id, u.name

请注意,根据文字日期过滤 date 列比在其上应用函数(排除使用索引)更有效。

【讨论】:

  • 你从哪里得到 u.*?还是您在此查询中创建它?
  • @Lzypenguin:from 子句将u 定义为表users 的别名。
  • 非常感谢!我刚刚按 count(m.user_id) desc 添加了订单;到你的第二次编辑,它完美地工作!!!!!!太感谢了!!!而且按日期排序的效果要好得多。
【解决方案2】:

您缺少按用户分组的 GROUP BY 子句:

SELECT u.user_id, u.name, COUNT(*) AS counter 
FROM users u JOIN messages m
ON m.user_id = u.user_id 
WHERE substr(m.date,1,4)='2020'
GROUP BY u.user_id, u.name

【讨论】:

  • 这也很有效。我刚刚删除了 u.user_id 因为它不是必需的,并按 count(*) desc 添加了 order;它给了我需要的输出。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2023-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-14
  • 1970-01-01
  • 2015-01-30
  • 2010-09-07
相关资源
最近更新 更多