Mysql рассчитывает на ЗАКАЗ, если не работает с Join

#php #mysql #sql

Вопрос:

У меня есть две таблицы «coin_review» и «un_user_follower»,и я хочу получить «Лучшего рецензента»(кроме меня(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
 

Комментарии:

1. Если cr.Review он уникален (по уникальному индексу), то используйте GROUP BY cr.id, cr.Review . Если нет, то используйте SELECT MIN(cr.id) AS id, ... . Где я ошибаюсь ? Представьте, что cr.Review это не уникально, и 2 строки с одинаковым значением имеют разные cr.id значения. Какое значение из этих 2-х должно быть возвращено в одной строке для этого Review ? сервер не знает, и, следовательно, он выдает ошибку.

2. @Akina: можете ли вы написать точный запрос, чтобы я мог проверить и реализовать его на своей стороне

3. Предоставьте сценарии СОЗДАНИЯ ТАБЛИЦ в первую очередь для обеих таблиц (отредактируйте текст своего вопроса). Также объясните, откуда берется выходное значение для TotalFollowers … Сумма ненулевого to_wallet_address values значения ?

4. Полное объединение (используйте трюк, поскольку Mysql не поддерживает полные объединения) сгруппированные и отфильтрованные исходные таблицы.

5. @Serg: Тогда каково решение этой проблемы ? Как я могу привлечь большинство рецензентов ?

Ответ №1:

Два лучших рецензента и их подписчики считаются. Сначала групповые таблицы, затем ЛЕВОЕ СОЕДИНЕНИЕ.

 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<>скрипка

ВОЗВРАТ

 wallet_address  TotalReview TotalFollowers
12345   1   2
1234    2   2
 

Комментарии:

1.Разве это не привело бы к wallet_adress 12345 total_followers 2? Либо желаемый результат операции неверен, либо я не понимаю логики.

2. @Michel , да, он вернет total_followers = 2 для wallet_adress 12345. Я следовал формулировке «Общее число его последователей».

3. Я просто просил объяснить 1 , когда вы опубликовали ответ. Предположим, ОП допустил опечатку.

4. @Serg: это работает, но я хочу «0» в «TotalFollowers» вместо «NULL»

5. Добавил скрипку