2016-04-29 63 views
0

我有一个表,ReadingList,它由几列组成。为了简单起见,让我们称他们为:mySQL - 计算具有相同值的实例数,对于不同的用户

  • reading_id
  • link_id_fk
  • user_id_fk

reading_id只是一个AI关键。 link_id_fk可以存在多次(每个user_id_fk

我想要做的,就是找到前10link_id_fk值,由大多数用户的存储。

这里是它我的垃圾尝试(我只是得到145回来,我不知道在哪里得到它,这个数字 - 但它肯定不是数我期待:))

SELECT 
    *, 
    (SELECT COUNT(*) 
    FROM ReadingList 
    WHERE link_id_fk = ReadingList.link_id_fk) AS total_saves 
FROM 
    ReadingList 
WHERE 
    user_id_fk IN ('test123', 'test2') AND 
    link_id_fk > 0 AND deleted = 0; 

的所需的示例输出将是:

link_id_fk total_saves 
12   3 
34   2 
56   1 
78   1 

任何人都可以指向正确的方向吗?

谢谢!

+0

@Strawberry - DDL? –

+0

如果您喜欢,请考虑遵循以下简单的两步操作步骤:1.如果您尚未这样做,请提供适当的CREATE和INSERT语句(和/或sqlfiddle),以便我们可以更轻松地复制问题。 2.如果您尚未这样做,请提供与步骤1中提供的信息相对应的所需结果集。显然,在这种情况下,如果将问题简化为“前5名”,则会有所帮助。 – Strawberry

回答

1

,你可以在一个子查询使用GROUP BY

SELECT rl2.link_id_fk, rl2.nb_link 
FROM (
    SELECT link_id_fk, count(*) as nb_link 
    FROM ReadingList 
    WHERE 
    user_id_fk IN ('test123','test2') 
    AND link_id_fk > 0 
    AND deleted = 0 
    GROUP BY link_id_fk 
) as rl2 
ORDER BY rl2.nb_link DESC 
LIMIT 10; 
+0

谢谢 - 这就像一个魅力:) –

+0

为什么你需要子查询?你可以在该查询中放置ORDER BY和LIMIT。 – Barmar

+0

@Barmar不完全...至少在旧版本中,'GROUP BY'之前的'ORDER BY'/'LIMIT'触发器,所以你不能依赖于这种查询。 – Preuk

相关问题