Mysql 联接表和计数的正确方法

Mysql 联接表和计数的正确方法,mysql,join,count,Mysql,Join,Count,假设我有三张桌子。 它们被称为用户、线程、帖子。我需要知道有多少帖子和帖子 用户已在一个sql行中创建。最好的方法是什么?我想做如下的连接,这是正确的/最好的方法吗?但我如何计算呢 SELECT *, FROM users LEFT JOIN threads on threads.user_id=users.user_id LEFT JOIN posts on posts.user_id=users.user_id WHERE user_id='1' 首先,在选择*后有一个逗号。第二,当需要线

假设我有三张桌子。 它们被称为用户、线程、帖子。我需要知道有多少帖子和帖子 用户已在一个sql行中创建。最好的方法是什么?我想做如下的连接,这是正确的/最好的方法吗?但我如何计算呢

SELECT *,
FROM users
LEFT JOIN threads on threads.user_id=users.user_id
LEFT JOIN posts on posts.user_id=users.user_id
WHERE user_id='1'

首先,在
选择*
后有一个逗号。第二,当需要线程和帖子时,为什么要查询用户表?第三,为什么(它?)是
userid
a
char

SELECT COUNT(user_id) FROM threads WHERE user_id='1'
SELECT COUNT(user_id) FROM posts WHERE user_id='1'

如果希望在一个查询中使用UNION,请使用UNION。

首先,在
选择*
后有一个逗号。第二,当需要线程和帖子时,为什么要查询用户表?第三,为什么(它?)是
userid
a
char

SELECT COUNT(user_id) FROM threads WHERE user_id='1'
SELECT COUNT(user_id) FROM posts WHERE user_id='1'
    SELECT 
    COUNT() as posts,
    FROM users
    LEFT JOIN threads on threads.user_id=users.user_id
    LEFT JOIN posts on posts.user_id=users.user_id
    WHERE user_id='1'

如果希望在一个查询中使用UNION,请使用UNION。

您可以使用类似的方法应用和聚合函数来获取总计数:

    SELECT 
    COUNT() as posts,
    FROM users
    LEFT JOIN threads on threads.user_id=users.user_id
    LEFT JOIN posts on posts.user_id=users.user_id
    WHERE user_id='1'
SELECT u.user_id, 
    coalesce(TotalThreads, 0) + coalesce(TotalPosts, 0) Total
FROM users u
LEFT JOIN
(
  select user_id, count(thread_id) TotalThreads
  from threads
  group by user_id
) t
  on t.user_id=u.user_id
LEFT JOIN
(
  select user_id, count(post_id) TotalPosts
  from posts
  group by user_id
) p
  on p.user_id=u.user_id
WHERE u.user_id='1'
如果要将这些值分开,则:

SELECT u.user_id, 
   coalesce(TotalThreads, 0) TotalThreads, 
   coalesce(TotalPosts, 0) TotalPosts
FROM users u
LEFT JOIN
(
  select user_id, count(thread_id) TotalThreads
  from threads
  group by user_id
) t
  on t.user_id=u.user_id
LEFT JOIN
(
  select user_id, count(post_id) TotalPosts
  from posts
  group by user_id
) p
  on p.user_id=u.user_id
WHERE u.user_id='1'

您可以使用类似这样的应用和聚合函数来获取总计数:

SELECT u.user_id, 
    coalesce(TotalThreads, 0) + coalesce(TotalPosts, 0) Total
FROM users u
LEFT JOIN
(
  select user_id, count(thread_id) TotalThreads
  from threads
  group by user_id
) t
  on t.user_id=u.user_id
LEFT JOIN
(
  select user_id, count(post_id) TotalPosts
  from posts
  group by user_id
) p
  on p.user_id=u.user_id
WHERE u.user_id='1'
如果要将这些值分开,则:

SELECT u.user_id, 
   coalesce(TotalThreads, 0) TotalThreads, 
   coalesce(TotalPosts, 0) TotalPosts
FROM users u
LEFT JOIN
(
  select user_id, count(thread_id) TotalThreads
  from threads
  group by user_id
) t
  on t.user_id=u.user_id
LEFT JOIN
(
  select user_id, count(post_id) TotalPosts
  from posts
  group by user_id
) p
  on p.user_id=u.user_id
WHERE u.user_id='1'
这样行吗

从用户u、线程t、帖子p中选择计数(*)
其中t.user\u id=u.user\u id
p.user\u id=u.user\u id
和用户_id='1'

我对SQL不感兴趣…

这样行吗

从用户u、线程t、帖子p中选择计数(*)
其中t.user\u id=u.user\u id
p.user\u id=u.user\u id
和用户_id='1'


我对SQL不感兴趣…

你基本上已经做到了。由于
count
是一个组,因此您只需按
用户id
进行分组即可:

select users.user_id as [User ID]
,count(threads.user_id) as [Number of Threads]
,count(posts.user_id) as [Number of Posts]
from users
left join threads on threads.user_id = users.user_id
left join posts on posts.user_id = users.user_id
where user_id = '1'
group by users.user_id

这样,您的
where
子句就成为可选的。如果您想要一个包含所有用户及其对应线程/帖子计数的独特列表,您可以将其删除。

基本上就在这里。由于
count
是一个组,因此您只需按
用户id
进行分组即可:

select users.user_id as [User ID]
,count(threads.user_id) as [Number of Threads]
,count(posts.user_id) as [Number of Posts]
from users
left join threads on threads.user_id = users.user_id
left join posts on posts.user_id = users.user_id
where user_id = '1'
group by users.user_id

这样,您的
where
子句就成为可选的。如果您想要一个包含所有用户及其对应线程/帖子计数的独特列表,您可以将其删除。

如果您只有一个用户id,则不需要。

因为
WHERE
@BartFriederichs yes,这就是为什么我说
WHERE
是可选的。如果有多个用户,只需将其删除,就可以按用户id(或任何其他列,如用户名)对其进行分组。。。或者你可以像他们在本例中所做的那样针对特定的用户。如果你只有一个用户id,则不需要。你这样做是因为
WHERE
@BartFriederichs是,这就是为什么我说
WHERE
是可选的。如果有多个用户,只需将其删除,就可以按用户id(或任何其他列,如用户名)对其进行分组。。。或者你也可以像他们在本例中所做的那样针对特定用户。没错,但是一个想法可能会有所帮助。请使用注释部分进行说明。或者尝试一下你的想法,确保它有效,然后给出答案。没错,但是一个想法可能会有帮助。请使用评论部分。或者尝试一下你的想法,确保它有效,然后给出答案。