【问题标题】:how to count same rating from field in sql如何从sql中的字段计算相同的评分
【发布时间】:2018-10-13 21:43:13
【问题描述】:

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

结果应该是这样的,在rating_cleanrating_deliciousrating_clean字段中显示所有评分(1、2、3、4、5)及其计数

感谢您的帮助。

但我得到的结果

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

result not should like this

结果不应该是这样的, 我的问题是,如何只选择 factor_clean 和 factor_delicious 其中 factor_clean =1 和 factor_delicious = 1

【问题讨论】:

  • 这个网站不是免费的代码编写者。最好把你的查询放在哪里并显示它卡在哪里
  • 同一个表中不能有 2 个名为 rating_clean 的列。
  • 您可以通过将样本数据和预期输出作为文本以及您迄今为止所做的事情来改进这个问题。我现在的猜测是你需要 count 和 group by。如果你的评级值不固定,那么你将需要动态 sql。
  • 您的数据根本不可能是这样的。见meta.stackoverflow.com/questions/333952/…
  • @P.Salmon 抱歉,现在我添加了一些查询、示例数据,并输出了我希望的内容:)

标签: mysql sql


【解决方案1】:

使用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;

【讨论】:

    【解决方案2】:

    例如,这是具有列 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_thirdfactors,插入带有 1 的新行,最后在 @987654329 中添加类似 your_table.rating_third*factors.factor_third 的内容@

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-30
      • 1970-01-01
      • 1970-01-01
      • 2012-07-09
      • 1970-01-01
      相关资源
      最近更新 更多