【问题标题】:Correct way to join tables and count连接表和计数的正确方法
【发布时间】:2013-01-11 10:13:12
【问题描述】:

假设我有 3 张桌子。 它们被称为用户、线程、帖子。我需要知道有多少帖子和线程 用户在一个 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'

【问题讨论】:

    标签: mysql join count


    【解决方案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'
    

    【讨论】:

      【解决方案2】:

      首先,SELECT * 后面有逗号。第二,当你想要线程和帖子时,为什么要查询用户表?第三,为什么(是吗?)user_idchar

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

      如果您想在一个查询中使用UNION

      【讨论】:

        【解决方案3】:

        你基本上就在那里。因为countaggregate function,所以您可以简单地按user_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 子句就变成了可选的。如果您想要所有用户的不同列表及其相应的线程/帖子计数,则可以将其删除。

        【讨论】:

        • 如果您只有一个 user_id,则不需要。而你这样做是因为WHERE
        • @BartFriederichs 是的,这就是为什么我说where 是可选的。如果有多个用户,只需将其删除以将它们全部按 user_id(或任何其他列,如用户名)分组......或者您可以像在此实例中那样定位特定用户。
        【解决方案4】:
            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'
        

        【讨论】:

          【解决方案5】:

          这行得通吗?

          SELECT COUNT (*) FROM users u, thread t, posts p WHERE t.user_id=u.user_id AND p.user_id=u.user_id AND user_id='1'

          我不太喜欢 SQL...

          【讨论】:

          • 是的,但一个想法可能会有所帮助。
          • 使用评论部分。或者尝试你的想法,确保它有效,然后给出答案。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多