【问题标题】:Mysql count on ORDERBY not working with JoinMysql 依靠 ORDERBY 不能与 Join 一起使用
【发布时间】:2021-10-14 08:09:51
【问题描述】:

我有两个表“coin_review”和“un_user_follower”,我想获取“Top Reviewer”(除了我(123),并且他的大多数评论存在,他的追随者) 这是我的表“coin_review”

id          Review              wallet_address      
1           Lorem Ipsum1        123 
2           Lorem Ipsum2        1234
3           Lorem Ipsum3        1234
4           Lorem Ipsum4        12345

...

这是我的表“un_user_follower”

id          from_wallet_address         to_wallet_address       
1           1234                            11111       
2           1234                            12254
3           123                             25141
4           12345                           14144
5           12345                           14798
...

现在我想获得顶级评论者(存在最多记录)和他的追随者总数 例如,我想要以下输出作为结果

id          wallet_address          TotalReview         TotalFollowers
1           1234                        2                   2
2           12345                       1                   1

为此,我尝试了以下查询

SELECT cr.id,COUNT(cr.Review) as Total,COUNT(usf.to_wallet_address)
FROM coin_review cr
JOIN un_user_follower usf
ON usf.to_wallet_address=cr.wallet_address
WHERE cr.wallet_address!='123'
GROUP BY cr.Review
ORDER BY Total ASC

但是我遇到了错误,我该如何解决这个问题?我哪里错了?

SELECT list is not in GROUP BY clause and contains nonaggregated column 'Uni_back.cr.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

【问题讨论】:

  • 如果cr.Review 是唯一的(根据唯一索引),则使用GROUP BY cr.id, cr.Review。如果没有,请使用SELECT MIN(cr.id) AS id, ...我哪里错了? 想象cr.Review 不是唯一的,具有相同值的两行具有不同的cr.id 值。对于这个Review,这两个值中的什么值必须在单行中返回?服务器不知道,因此会产生错误。
  • @Akina:你能写出准确的查询,这样我就可以在我身边检查和实施
  • 主要为两个表提供 CREATE TABLE 脚本(编辑您的问题文本)。还要说明TotalFollowers 的输出值是从哪里获得的... 非NULL to_wallet_address values 的数量?
  • 全连接(使用一个技巧,因为Mysql不支持全连接)对原始表进行分组和过滤。
  • @Serg:那么解决方案是什么?我怎样才能获得大多数审稿人?

标签: php mysql sql


【解决方案1】:

排名前两位的评论者及其关注者人数。 先分组表,然后 LEFT JOIN。

SELECT cr.wallet_address, cr.TotalReview, coalesce(fl.TotalFollowers,0) TotalFollowers
FROM (
  SELECT wallet_address, COUNT(Review) as TotalReview
  FROM coin_review 
  WHERE wallet_address!='123'
  GROUP BY wallet_address
  ORDER BY COUNT(Review) DESC
  LIMIT 2 
)  cr
LEFT JOIN (
  SELECT from_wallet_address,  COUNT(to_wallet_address) TotalFollowers
  FROM  un_user_follower
  WHERE from_wallet_address!='123'
  GROUP BY from_wallet_address
) fl ON cr.wallet_address = fl.from_wallet_address
ORDER BY cr.TotalReview ASC 

db<>fiddle

返回

wallet_address  TotalReview TotalFollowers
12345   1   2
1234    2   2

【讨论】:

  • 这不会导致wallet_adress 12345 total_followers 2吗?要么 OP 想要的结果是错误的,要么我不明白其中的逻辑。
  • @Michel ,是的,它会为 wallet_adress 12345 返回 total_followers = 2。我遵循了“他的追随者总数”的措辞
  • 当您发布答案时,我只是要求对 1 进行解释。假设 OP 打错了。
  • @Serg:它可以工作,但我希望“TotalFollowers”中的“0”而不是“NULL”
  • 添加了小提琴
猜你喜欢
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 2013-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-19
相关资源
最近更新 更多