как посчитать такой же рейтинг из поля в sql - PullRequest
0 голосов
/ 13 октября 2018

У меня проблема с подсчетом рейтингов в SQL.Вот как выглядят мои данные:

data

 CREATE TABLE `restaurant` (
  `id_restaurant` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id_restaurant`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

insert  into `restaurant`(`id_restaurant`,`name`) values (1,'Mc Donald');
insert  into `restaurant`(`id_restaurant`,`name`) values (2,'KFC');

    CREATE TABLE `user` (
  `id_user` int(11) NOT NULL AUTO_INCREMENT,
  `userName` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id_user`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;

insert  into `user`(`id_user`,`userName`) values (1,'Audey');


    CREATE TABLE `factors` (
  `factor_id` int(11) NOT NULL AUTO_INCREMENT,
  `factor_clean` int(11) NOT NULL DEFAULT '0',
  `factor_delicious` int(11) NOT NULL DEFAULT '0',
  `id_restaurant` int(11) DEFAULT NULL,
  `id_user` int(11) DEFAULT NULL,
  PRIMARY KEY (`factor_id`),
  KEY `id_restaurant` (`id_restaurant`),
  KEY `id_user` (`id_user`),
  CONSTRAINT `factors_ibfk_1` FOREIGN KEY (`id_restaurant`) REFERENCES `restaurant` (`id_restaurant`),
  CONSTRAINT `factors_ibfk_2` FOREIGN KEY (`id_user`) REFERENCES `user` (`id_user`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;

    insert  into `factors`(`factor_id`,`factor_clean`,`factor_delicious`,`id_restaurant`,`id_user`) values (1,1,5,1,1);
insert  into `factors`(`factor_id`,`factor_clean`,`factor_delicious`,`id_restaurant`,`id_user`) values (2,0,5,1,1);
insert  into `factors`(`factor_id`,`factor_clean`,`factor_delicious`,`id_restaurant`,`id_user`) values (3,1,5,1,1);
insert  into `factors`(`factor_id`,`factor_clean`,`factor_delicious`,`id_restaurant`,`id_user`) values (4,3,3,1,1);

И результат должен быть таким, Показать все рейтинги (1,2,3,4,5) и их счет из полей rating_clean, rating_delicious и rating_clean

enter image description here

Спасибо за помощь.

но результат я получаю

SELECT COUNT(`factor_clean`+`factor_delicious`),'1' AS rating_1 FROM `factors` WHERE 1 GROUP BY `id_restaurant`

результат не должен нравиться

результат не должен нравиться, мой вопрос в том, как выбрать просто factor_clean иfactor_delicious, где factor_clean = 1 и factor_delicious = 1

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

Используйте union all, чтобы отключить данные и затем агрегировать:

select id_restaurant, rating, count(*)
from ((select r.id_restaurant, r.rating_clean as rating, r.date
       from ratings r
      ) union all
      (select r.id_restaurant, r.rating_delicious, r.date
       from ratings r
      ) union all
      (select r.id_restaurant, r.rating_clean2, r.date
       from ratings r
      ) 
     ) r
group by id_restaurant, rating
order by id_restaurant, rating;
0 голосов
/ 13 октября 2018

Например, это решение для таблицы с столбцами rating_delicious и rating_clean (только один!):

Прежде всего вы должны создать дополнительную таблицу, я назвал ее коэффициентами:

CREATE TABLE `factors` (
 `factor_id` int(11) NOT NULL AUTO_INCREMENT,
 `factor_clean` int(11) NOT NULL DEFAULT '0',
 `factor_delicious` int(11) NOT NULL DEFAULT '0',
 PRIMARY KEY (`factor_id`)
)

Затем добавьте две записи:

INSERT INTO `factors` (`factor_id`, `factor_clean`, `factor_delicious`) VALUES (NULL, '1', '0'), (NULL, '0', '1');

Теперь вы можете присоединиться к этим таблицам и получить результаты:

SELECT x.id_restaurant
     , (x.rating_clean * f.factor_clean) + (x.rating_delicious * f.factor_delicious) AS rating
     , count(*) 
  FROM your_table x
  JOIN factors f
 WHERE 1 
 GROUP 
    BY x.id_restaurant
     , rating

Чтобы использовать следующий столбец (rating_third), вы должны и столбец factor_third до factors, вставьте новую строку с 1 в этот столбец и, наконец, добавьте что-то вроде your_table.rating_third*factors.factor_third к сумме в SELECT

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...