有没有办法输出具有更多实例数的值?

时间:2019-06-09 14:11:55

标签: mysql group-by aggregate-functions having-clause

我正在使用MySQL,但在尝试根据其等级输出地点列表时遇到麻烦。

我正在尝试输出一个具有单列(地点)的表,该表的地点名称的评级要比不良评级强很多。

这是我的评分表:

CREATE TABLE ratings (
   ID int
   place varchar(255)
   opinion varchar(255)
);

这是其中的数据:

id | place  | opinion
---+--------+--------
1  |Fiji    |Good 
2  |Fiji    |Not good 
3  |Canada  |Good 
4  |Canada  |Good
5  |Canada  |Good
6  |France  |Good
7  |France  |Not good
8  |Russia  |Not good
9  |Laos    |Good

我的查询应返回如下内容:

place
-------
Canada

到目前为止,我很困惑。我觉得我应该以某种方式比较使用count的等级列,但是我对SQL还没有足够的经验。有人可以帮忙吗?

4 个答案:

答案 0 :(得分:1)

这是IF,SUM和GROUP BY的工作。 (https://www.db-fiddle.com/f/qJzieGghoAr1u98cRQ3mBU/0

SELECT place
  FROM rating
 GROUP BY place
 HAVING SUM(IF(opinion = 'Good',1,-1)) > 0

表达式IF(opinion = 'Good',1,-1)根据等级列的文本给出1或-1。将它们加总可得出整体商品减去不良商品。使用> 0过滤器将所有内容放入HAVING子句中,只会捕获那些净得分为“好”的内容。

仔细研究IF,SUM,COUNT和GROUP BY值得您麻烦。它们是SQL的非常重要的部分。

答案 1 :(得分:0)

您可以使用count和group by并按count desc限制1个顺序

select place 
from my_table  
where opinion  ='good'
group by place 
order by count(*) desc 
limit 1

或使用基于好/不好的评分

select place 
from my_table  
group by place 
order by sum(case when opinion ='good' then 1 when opinion='Not good' then -1 end) desc 
limit 1 

答案 2 :(得分:0)

首先,这种数据库设计在实际数据上不能很好地工作。因为它是自然语言,所以您如何评估意见。例如,“这很好,但是太贵了”之间的区别是什么。 “这不是很好,但是我喜欢文化……”。

因此,您必须提供一种更定量的评估方式。我建议添加一列“评级”(从1星到5星)。 (最好是5分。)

CREATE TABLE ratings (
   ID int
   place varchar(255)
   opinion varchar(255)
   rating int
);

设计完成后,我们会继续提问:最好的地方是什么?

  • 它可能是五星级评级最高的地方。
  • 这是最高的平均评分。例如:3.5评分超过3.0评分。
  • ...

定义此度量标准很困难,并且取决于度量标准,我们将分别解决。可以使用SQL来实现某些解决方案,必须使用管道来实现某些解决方案(例如:作业队列执行一些复杂的任务以进行评分)。

答案 3 :(得分:0)

尝试这个。

SELECT place
    FROM ratings
    GROUP BY place ORDER BY COUNT(opinion) DESC LIMIT 1

我希望这会有所帮助。