Bonny AUlia
Bonny AUlia

Reputation: 95

how to count same rating from field in sql

I have a problem counting ratings in SQL. This is what my data looks like:

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);

And the result should be like this, Show all ratings (1,2,3,4,5) and their count from the fields rating_clean, rating_delicious, and rating_clean

enter image description here

Thanks for your help.

but the result i get

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

result not should like this

the result should not like that, my question is, how to select just factor_clean and factor_delicious where factor_clean =1 and factor_delicious = 1

Upvotes: 0

Views: 101

Answers (2)

Gordon Linoff
Gordon Linoff

Reputation: 1270021

Use union all to unpivot the data and then aggregate:

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;

Upvotes: 1

domino_pl
domino_pl

Reputation: 303

For example this is solution for table with colums rating_delicious and rating_clean (only one!):

First of all you should create additional table, I called it factors:

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`)
)

Next add two records:

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

Now you can join this tables and get results:

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

In order to use next colum (rating_third), you should and column factor_third to factors, insert new row with 1 in this column and finally add something like your_table.rating_third*factors.factor_third to sum in SELECT

Upvotes: 0

Related Questions