【问题标题】:Select count of users over two tables选择两个表中的用户数
【发布时间】:2014-02-18 01:58:09
【问题描述】:

我想计算两个表中相同用户 ID 的出现次数。 jos_findme 表中包含所有用户。另外两个也有“用户ID”列。

但我想要两张表中的总数。我试过了,但它不起作用?

SELECT 
    c.user_id, count(c.user_id) AS counter
FROM
    jos_findme as c
        LEFT JOIN
    jos_findme_bestof as b ON b.user_id = c.user_id
        LEFT JOIN
    jos_findme_pair as p ON p.user_id = c.user_id
WHERE
    c.user_id > 0
GROUP BY c.user_id
ORDER BY counter DESC
LIMIT 10

所有表都有“user_id”列。我只想将它们算在“jos_findme_bestof”和“jos_findme_pair”表中

【问题讨论】:

  • 全部算在内? user_id 在两个表中通用还是 user_id 在其中一个表中通用?请详细说明标准和表格定义
  • 您可以添加数据库架构或示例数据,您真正需要什么?让我们猜测会更好。
  • 所有表都有“user_id”列。我只想把它们算在“jos_findme_bestof”和“jos_findme_pair”表中

标签: mysql sql select count group-by


【解决方案1】:

我认为你可以这样做:

SELECT AA.user_id, AA.Acounter + BB.Bcounter
from     (SELECT a.user_id, count(a.user_id) AS Acounter
          FROM jos_findme_bestof as a
          GROUP BY a.user_id) as AA 
     Join  
        (SELECT b.user_id, count(b.user_id) AS Bcounter
          FROM jos_findme_pair as b
          GROUP BY b.user_id) as BB
     on AA.user_id = BB.user_id

如果您想要所有的 id(即 jos_findme_pair 中是否有 jos_findme_bestof 中没有的 id)- 使用 FULL OUTER JOIN

【讨论】:

  • 抱歉,t.user_id 是什么?
  • 完美!!!!小问题如何锁定添加“jos_findme_style”的 3 个表
  • 为 "jos_findme_style" 添加 1 个连接,就像我将 "jos_findme_pair" 添加为 CC 并将其添加到顶部选择中一样。我认为这应该有效
  • SELECT AA.user_id, AA.Acounter + BB.Bcounter + CC.Ccounter from (SELECT a.user_id, count(a.user_id) AS Acounter FROM jos_findme_bestof as a GROUP BY a.user_id) as AA Join (SELECT b.user_id, count(b.user_id) AS Bcounter FROM jos_findme_pair as b GROUP BY b.user_id) as BB on AA.user_id = BB.user_id Join (SELECT c.user_id, count(c.user_id) AS Ccounter FROM jos_findme_style as c GROUP BY c.user_id) as CC on AA.user_id = CC.user_id
  • 抱歉,还有一个问题。现在如何向用户表“jos:findme”添加 WHERE?就像 WHERE username = "max" AND 有一个错误:它只显示所有 3 个表中的用户 ID ;-)
【解决方案2】:

相关的子查询在这里可能很有用:

SELECT c.user_id, 
       (SELECT Count(*) 
        FROM   jos_findme_bestof b 
        WHERE  b.user_id = c.user_id), 
       (SELECT Count(*) 
        FROM   jos_findme_pair p 
        WHERE  p.user_id = c.user_id) 
FROM   jos_findme c 

【讨论】:

  • 我使用 SELECT c.user_id, (SELECT COUNT() FROM jos_findme_bestof b WHERE b.user_id = c.user_id) 作为 bCount, (SELECT COUNT() FROM jos_findme_pair p WHERE p.user_id = c.user_id) as pCount, (SELECT COUNT(*) FROM jos_findme_style s WHERE s.user_id = c.user_id) as sCount FROM jos_findme c 但我不能添加“总计”列?
  • @user2881954:您的问题并不清楚您是否需要这样的专栏。可以简单地用添加 + 运算符替换上面我的答案中分隔子查询的逗号;但是,@Mzf's solution 的性能可能更高。
【解决方案3】:

试试这个:

SELECT c.user_id, (IFNULL(b.bCount, 0) + IFNULL(p.pCount, 0)) AS counter
FROM jos_findme AS c
LEFT JOIN (SELECT b.user_id, COUNT(1) bCount 
           FROM jos_findme_bestof b 
           GROUP BY b.user_id 
         ) AS b ON b.user_id = c.user_id 
LEFT JOIN (SELECT p.user_id, COUNT(1) pCount 
           FROM jos_findme_pair p 
           GROUP BY p.user_id 
         ) AS p ON p.user_id = c.user_id 
WHERE c.user_id > 0
GROUP BY c.user_id
ORDER BY counter DESC
LIMIT 10

【讨论】:

    【解决方案4】:

    试试这个

    SELECT c.user_id,
           Users1 = (SELECT COUNT(*) FROM jos_findme_bestof b WHERE b.user_id = c.user_id),
           Users2 = (SELECT COUNT(*) FROM jos_findme_pair p WHERE p.user_id = c.user_id),
           TotalUser = (SELECT COUNT(*) FROM jos_findme_bestof b WHERE b.user_id = c.user_id)
           +
           (SELECT COUNT(*) FROM jos_findme_pair p WHERE p.user_id= c.user_id)
    FROM   
    jos_findme c
    

    在这里, Users1 将返回来自jos_findme_bestof 的所有用户 Users2 将返回来自jos_findme_pair 的所有用户 TotalUser 将同时计入两个表

    希望对你有帮助! 谢谢。

    【讨论】:

    • “字段列表”中的未知列“c.UserID”如何解决?
    • 我已经更新了我的答案。那是因为我在我的测试数据库中创建了UserID 而不是user_id。现在一切就绪,测试一下,如果您还有任何问题,请告诉我!
    • 抱歉,我得到:“字段列表”中的未知列“Users1”
    • 您使用的是mysql 还是sql?我已经为sql 准备并测试了查询。并将您的查询粘贴到此处。
    猜你喜欢
    • 1970-01-01
    • 2011-09-06
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多