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

Тема в разделе "Базы данных", создана пользователем Smile, 15 ноя 2012.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Smile

    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:
     
  2. Darkmind

    Darkmind SNMP maniac

    Регистр.:
    31 май 2006
    Сообщения:
    184
    Симпатии:
    76
    Конечно, куда логичнее было бы хранить рейтинг, как 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 и его суммарный рейтинг
     
    Smile нравится это.
  3. unknown34

    unknown34 Создатель

    Регистр.:
    8 сен 2008
    Сообщения:
    19
    Симпатии:
    2
    переведите в tinyint и не мучайтесь. да, запрос что написал Darkmind в предыдущем посте отработает, но в дальнейшем будет сложно делать другие запросы. да и сами подзапросы лучше избегать ввиду невозможности СУБД использовать индекс в таких случаях
     
  4. Андрей Шпак

    Андрей Шпак Создатель

    Регистр.:
    11 фев 2013
    Сообщения:
    43
    Симпатии:
    7
    Чтобы не менять структуру и скрипто - вводите дополнительное поле в таблицу, скажем да - tinyint - и заполняете на основе bad\good => -1\1
    Ну и запросы соответственные. А на формировании bad\good - ставть дополнение - заполнение этого допполя - чтобы в дальнейшем не проводить подобные запросы. Тогда вся остальная аналитика (если она есть на сайте или еще где) - не поползет из-за манипуляций с полем
     
  5. h_hogan

    h_hogan Создатель

    Регистр.:
    8 мар 2013
    Сообщения:
    39
    Симпатии:
    2
    Как вариант - создаем новую таблицу, вида
    rating_name | rating_val

    good | 1
    bad | -1

    И потом спокойно делаем выборку по первой таблице, присоединяя к ней эту, делая сумму по полю rating_val
     
  6. z!m3r

    z!m3r

    Регистр.:
    17 июн 2006
    Сообщения:
    241
    Симпатии:
    213
    чтоб не создавать отдельную тему, пишу здесь.

    Добрый день всем, помогите решить проблему, переношу сайт с базой, база около 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)
    Как исправить?
     
  7. Rand

    Rand Писатель

    Регистр.:
    30 авг 2013
    Сообщения:
    7
    Симпатии:
    1
    z!m3r В первом случае ошибка с правами - у пользователя vkar не хватает прав на заливку в базу te_baza. Во втором случае, скорее всего ошибка в кодировке, например, дамп создан utf8, а заливается с базу с кодировкой cp1251.
     
    z!m3r нравится это.
  8. z!m3r

    z!m3r

    Регистр.:
    17 июн 2006
    Сообщения:
    241
    Симпатии:
    213
    Спасибо!

    так во втором случае заливаю через dumper.php, а таблицы в базе ровно кодировкам CHARSET=cp1251 и в свою очередь думпер должен сам автоматом подбирать кодировки? или я путаю.
     
  9. BDSG

    BDSG

    Регистр.:
    28 фев 2009
    Сообщения:
    203
    Симпатии:
    109
    а что есть этот "dumper.php"?..
     
  10. z!m3r

    z!m3r

    Регистр.:
    17 июн 2006
    Сообщения:
    241
    Симпатии:
    213
    Изначально SypexDumper создавался для работы с большими базами данных, при этом он должен был быть максимально быстрым, компактным и удобным.
     
Статус темы:
Закрыта.