【问题标题】:SQL complex selectionSQL复杂选择
【发布时间】:2016-10-19 17:02:54
【问题描述】:

我必须找出一个非常复杂的选择。 不知道这怎么可能,但我认为是的。


有两个表:

线程:主键是列'thread_id'

订阅:主键是 'user' 和 'thread_id'


我需要一个选择所有线程订阅的人数排序。


示例情况

表'threads'中有threads ids 1 - 5

订阅表如下:

user     thread_id
x        1
x        2
y        2
z        4
z        2

您可以看到,订阅最多的线程是 2。 我想要一个在结果中将 thread_id 2 放在首位的选项,因为 2 是订阅最多的选项。


那么谁能帮助我?我尝试了一个小时,但没有找到解决方案

【问题讨论】:

  • SUM(), GROUP BY , ORDER BY 是你的朋友

标签: java mysql sql resultset


【解决方案1】:
SELECT thread_id, COUNT(*) AS cpt FROM subscribes GROUP BY thread_id ORDER BY cpt

【讨论】:

    【解决方案2】:

    只需在 thread_id 字段上分组并相应地获取您的计数。虽然不会考虑同一用户上的多个绑定,但如果此表允许这样做,那将是一个约束问题。

    select thread_id, count(*) as thread_count from threads group by thread_id, order by thread_count desc;
    

    【讨论】:

      【解决方案3】:

      我认为这是您可能的解决方案

      SELECT
          s.thread_id, COUNT(DISTINCT s.user) AS total_subscribed
      FROM    
          subscribes s
      INNER JOIN threads t 
          ON s.thread_id = t.thread_id
      GROUP BY
          s.thread_id 
      ORDER BY
          total_subscribed DESC
      

      如果您没有重复的用户,则不需要 DISTINCT

      【讨论】:

      • 为了确保 thread_id 我添加了两个表的连接查询。您只能使用订阅表来获取结果。
      【解决方案4】:

      您可以使用计数和分组方式

      select user, count(*) 
      from Subscribe 
      group by thread_id
      order by thread_id;
      

      【讨论】:

      • 它应该是ordered_by和grouped_by thread_id来获取每个线程的用户数。
      猜你喜欢
      • 2013-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-30
      • 2015-11-04
      • 2013-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多