Помогите с mysql запросом

Статус
В этой теме нельзя размещать новые ответы.

Smile

Старатель
Регистрация
12 Ноя 2006
Сообщения
157
Реакции
11
Привет всем,

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

есть таблица....

id | post_id | ip | rating

1 | 1 | 192.168.1.1 | good
2 | 1 | 192.168.1.2 | good
3 | 1 | 192.168.1.3 | bad
4 | 2 | 192.168.1.1 | bad
5 | 2 | 192.168.1.2 | good
6 | 2 | 192.168.1.3 | bad
4 | 3 | 192.168.1.1 | bad
5 | 3 | 192.168.1.2 | good
6 | 3 | 192.168.1.3 | bad
6 | 3 | 192.168.1.4 | bad

нужно подсчитать общее количество good, bad поста а потом сделать разницу...
к примеру:
у поста номер 1 , 2 - good , 1 - bad , 2-1 = 1
у поста номер 2 , 1 - good , 2 - bad , 1-2 = -1
у поста номер 3 , 1 - good , 3 - bad , 1-3 = -2

в общем нужно получить:

id | post_id | rating

1 | 1 | 1
2 | 2 | -1
3 | 3 | -2

:thenks:
 
Конечно, куда логичнее было бы хранить рейтинг, как TINYINT и сразу записывать good, как 1, а bad, как -1. И потом делать просто SUM, но раз уж оценки хранятся в виде строк, ок, поработаем с тем, что есть.

Шаг №1
Превратим good в 1, bad в -1
Код:
SELECT * FROM (
    SELECT `post_id`, IF(`rating`='good', 1, -1) AS `rating` FROM `test` AS `t1`
) AS `t2`
Данный запрос принимает за аксиому, что в rating может существовать всего две строки: good и bad. Если их должно быть больше - придётся расширить IF

Шаг №2
Просуммируем полученный результат из предыдущего запроса, обернув его в другой SELECT
Код:
SELECT `post_id`, SUM(`t2`.`rating`) AS `rating` FROM (
    SELECT `post_id`, IF(`rating`='good', 1, -1) AS `rating` FROM `test` AS `t1`
) AS `t2` GROUP BY `post_id`
Поле id лишено смысла в этом запросе, поэтому результат содержит post_id и его суммарный рейтинг
 
переведите в tinyint и не мучайтесь. да, запрос что написал Для просмотра ссылки Войди или Зарегистрируйся в предыдущем посте отработает, но в дальнейшем будет сложно делать другие запросы. да и сами подзапросы лучше избегать ввиду невозможности СУБД использовать индекс в таких случаях
 
Чтобы не менять структуру и скрипто - вводите дополнительное поле в таблицу, скажем да - tinyint - и заполняете на основе bad\good => -1\1
Ну и запросы соответственные. А на формировании bad\good - ставть дополнение - заполнение этого допполя - чтобы в дальнейшем не проводить подобные запросы. Тогда вся остальная аналитика (если она есть на сайте или еще где) - не поползет из-за манипуляций с полем
 
Как вариант - создаем новую таблицу, вида
rating_name | rating_val

good | 1
bad | -1

И потом спокойно делаем выборку по первой таблице, присоединяя к ней эту, делая сумму по полю rating_val
 
чтоб не создавать отдельную тему, пишу здесь.

Добрый день всем, помогите решить проблему, переношу сайт с базой, база около 90мб размер. Не сжатом виде 690мб.

Заливаю в жатом виде прямо майскл , вылетает ошибка:

Код:
Erreur
Requête SQL:

# Date: Sun, 01 Sep 2013 22:32:21 +0300
# Database Name: "te_baza"
#____________________________________________________________
DROP DATABASE IF EXISTS  `te_baza` ;


MySQL a répondu: Documentation

#1044 - Access denied for user 'vkar'@'localhost' to database 'te_baza'

Пробую залить думпером, выдает такое:
Код:
Подключение к БД `te_baza`.
Чтение файла `dump_2013-01.sql.gz`.
------------------------------------------------------------
2013.09.02 12:43:51
Возникла ошибка!
Неправильный запрос.
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Сэкономить на услугах  достаточно трудно. ' at line 1 (256)

Как исправить?
 
Для просмотра ссылки Войди или Зарегистрируйся В первом случае ошибка с правами - у пользователя vkar не хватает прав на заливку в базу te_baza. Во втором случае, скорее всего ошибка в кодировке, например, дамп создан utf8, а заливается с базу с кодировкой cp1251.
 
Спасибо!

Во втором случае, скорее всего ошибка в кодировке, например, дамп создан utf8, а заливается с базу с кодировкой cp1251.
так во втором случае заливаю через dumper.php, а таблицы в базе ровно кодировкам CHARSET=cp1251 и в свою очередь думпер должен сам автоматом подбирать кодировки? или я путаю.
 
а что есть этот "dumper.php"?..
 
а что есть этот "dumper.php"?..
Скрытое содержимое доступно для зарегистрированных пользователей!
Изначально SypexDumper создавался для работы с большими базами данных, при этом он должен был быть максимально быстрым, компактным и удобным.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху