Как по имени пользователя получить данные из базы и подсчитать их?
Мне необходимо из базы данных по имени пользователя получить количество положительных и отрицательных отзывов, где положительные имеют статус 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 шт):
Попробуйте
$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'