@9StarRu

Как по имени пользователя получить данные из базы и подсчитать их?

Мне необходимо из базы данных по имени пользователя получить количество положительных и отрицательных отзывов, где положительные имеют статус ok, а отрицательные trush

Вот так обращаюсь к базе:

$reviews = $db->super_query("SELECT * FROM ".PREFIX."_users_balance WHERE name='".$row['autor']."'",true);


Как далее получить результат для конкретного пользователя $row['autor'] из поля status и сложить результат?

Т.е. в таблице PREFIX."_users_balance могут быть сотни записей про одного юзера $row['autor'], как со статусом ok, так и trush, а получить в итоге нужно числа.

Кроме того, информации о пользователе может и не быть в таблице или статус может иметь иное значение.

Помогите сделать верный запрос и вывести результат.

Спасибо!
  • Вопрос задан
  • 71 просмотр
Решения вопроса 1
gscraft
@gscraft
Программист, философ
Ну, вывести результат придется самостоятельно. А вариантов запросов множество. Через JOIN, через вложенные запросы, через группировку по значению, но в любом случае с агрегацией. Далее примеры решения, без знания структуры Ваших данных и без оптимизаций. В первом случае Вы получите по 2 (и более) строки на каждого пользователя (например, user_id=1, status='ok', name= 'John galt', status_count=2 и user_id=1, status='trash', name= 'John galt', status_count=67):
SELECT *, COUNT(status) as status_count FROM table_name WHERE name = :name GROUP BY user_id, status;

В этом случае получите 1 строку на каждого пользователя, но запрос, возможно, тяжелее (user_id=1, name= 'John galt', status_ok_count=2, status_trash_count=95)
SELECT COUNT(ok.status) as status_ok_count, COUNT(trash.status) as status_trash_count, table_name.user_id, table_name.name
FROM table_name WHERE name=?
   INNER JOIN table_name as ok ON ok.user_id = table_name.user_id
   INNER JOIN table_name as trash ON trash.user_id = table_name.user_id
WHERE table_name.name = :name AND ok.status = 'ok' AND trash.status='trash'
GROUP BY table_name.user_id;

PS Есть смысл делать выборку не по имени, а по идентификатору, если надо получить данные на пользователя (а не найти именно по имени), запросы по первичному ключу всегда существенно быстрее.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы