#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
ВОЗВРАТ
wallet_address TotalReview TotalFollowers
12345 1 2
1234 2 2
Комментарии:
1.Разве это не привело бы к
wallet_adress
12345total_followers
2? Либо желаемый результат операции неверен, либо я не понимаю логики.2. @Michel , да, он вернет total_followers = 2 для wallet_adress 12345. Я следовал формулировке «Общее число его последователей».
3. Я просто просил объяснить 1 , когда вы опубликовали ответ. Предположим, ОП допустил опечатку.
4. @Serg: это работает, но я хочу «0» в «TotalFollowers» вместо «NULL»
5. Добавил скрипку