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

Мне необходимо из базы данных по имени пользователя получить количество положительных и отрицательных отзывов, где положительные имеют статус 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, а получить в итоге нужно числа.

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

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

Спасибо!


Ответы (1 шт):

Автор решения: S.H.

Попробуйте

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

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

Разница - в функции count(*), которая и возвращает число, и в условии status='ok' или status='trash'. Ну, и имя колонки, которая хранит статус, надо проверить.

Дополнение, написанное после комментария.

Как получить результат

А как Вы обычно получаете результат при обращении к базе? в результате вызова count(*) вернется рекордсет, состоящий из одной безымянной колонки, которая содержит одно число - счетчик.

Если колонке надо дать имя - можно использовать конструкцию select count(*) as cnt1 from ... - у колонки появилось имя cnt1

Для того, чтобы уменьшить сложность понимания и разделить задачу на части - имеет смысл использовать какой то 'дружественный' клиент базы данных, в котором можно написать и отладить все sql-запросы, прежде чем вставлять их в php. Я рекомендую mysql workbench, он легко гуглится.

Как сделать это одним запросом к базе.

Интересный вопрос. Дело в том, что Вы обращаетесь к базе дважды, с двумя разными условиями.

К сожалению, способ, который я придумал - не очень изящный. Фактически, он склеивает два запроса в один, используя оператор union.

Приведу пример, из которого Вы сможете переписать код для своего случая:

Пусть я хочу определить кол-во компьютеров в двух подсетях.

Я делаю это запросом

select count(*) from IpList where Ip like '192.168.10.%'

для подсети 192.168.10.x, и запросом

select count(*) from IpList where Ip like '192.168.12.%'

для подсети 192.168.12.x

Теперь скомбинируем два запроса в один:

    select count(*) as cnt1,        0 as cnt2  from IpList where Ip like '192.168.10.%'
    union
    select        0 as cnt1, count(*) as cnt2  from IpList where Ip like '192.168.12.%'

В результате вернется 2 столбца и 2 строки с числами вроде такого:

    cnt1    cnt2
    3       0
    0       11

Если из первой строки взять cnt1, а из второй - cnt2, то получится как раз то, что нужно.

В Вашем случае условиями в первом запросе будет status='ok', а во втором status='trash'

→ Ссылка