两张表,如何统计用户信息和总数?

users表

id name
1 xxx
2 yyy
3 zzz

articles表

id user_id created_at body
1 1 2023:02:17 body
2 2 2023:02:17 body
3 2 2023:02:16 body

期望查询结果如下

id name count(*)当天的文章数量 count(*)本周的文章数量
1 xxx 1 1
2 yyy 1 2
3 zzz 0 0

请问上述的sql如何写:sweat_smile:

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
最佳答案

在user模型中定义 ,按道理是一对多吧

file
代码的话按道理应该是这样

file

1年前 评论
cccyzloong (楼主) 1年前
讨论数量: 6
select
    uid
        , sum(CASE when created_at between '2022-01-01' and '2022-01-01 23:59:59.999' THEN 1 else 0 end) one_day
    , sum(CASE when created_at between '2022-01-01' and '2022-01-07 23:59:59.999' THEN 1 else 0 end) one_week
from tb
where created_at between '2022-01-01' and '2022-01-07 23:59:59.999' -- 其他条件
group by uid
1年前 评论

首先确定参数为当天与本周日期,假设今天为2023:02:17
解法一:
SELECT
u.id,
u. NAME,
IF (d.count, d.count, 0) AS ‘count () 当天的文章数量’,
IF (w.count, w.count, 0) AS ‘count (
) 本周的文章数量’
FROM
articles a
LEFT JOIN users u ON u.id = a.user_id
LEFT JOIN (
SELECT
user_id,
count() AS count
FROM
articles
WHERE
created_at LIKE ‘2023:02:17%’
GROUP BY
user_id
) d ON d.user_id = u.id
LEFT JOIN (
SELECT
user_id,
count(
) AS count
FROM
articles
WHERE
YEARWEEK(created_at, ‘%Y:%m:%d’) = YEARWEEK(now())
GROUP BY
user_id
) w ON w.user_id = u.id

解法二:
SELECT
u.id,
u. NAME,
sum(
IF (
LEFT (created_at, 10) = “2023:02:17”,
1,
0
)
) AS date_count,
sum(
IF (
YEARWEEK(created_at, ‘%Y:%m:%d’) = YEARWEEK(now()),
1,
0
)
) AS week_count
FROM
articles a
LEFT JOIN users u ON u.id = a.user_id
GROUP BY
u.id

1年前 评论

推荐使用模型关联,聚合查询,加上检索条件即可

模型关联《Laravel 9 中文文档》

$posts = Post::withCount([
    'comments',
    'comments as pending_comments_count' => function (Builder $query) {
        $query->where('approved', false);
    },
])->get();
1年前 评论

拿走试试 :smile:

file

SELECT user.username, COUNT(article.article_id) AS daily_count FROM user INNER JOIN article ON user.user_id = article.user_id WHERE article.publish_date >= CURDATE() GROUP BY user.user_id;

file SELECT user.username, YEARWEEK(article.publish_date) AS yearweek, COUNT(article.article_id) AS weekly_count FROM user INNER JOIN article ON user.user_id = article.user_id GROUP BY user.user_id, YEARWEEK(article.publish_date);

1年前 评论

在user模型中定义 ,按道理是一对多吧

file
代码的话按道理应该是这样

file

1年前 评论
cccyzloong (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!