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

Is there a way to output a value with the higher number of instances?

我正在使用 MySQL,但在尝试根据评分输出地点列表时遇到了问题。

我正在尝试输出一个 table 的单列(地点),其中包含具有 更多 好收视率而不是坏收视率的地名。

这是我的评分table:

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

我的查询应该return是这样的:

place
-------
Canada

到目前为止我很难过。我觉得我应该以某种方式使用计数来比较评级列,但我在 SQL 方面还不是很有经验。有人可以帮忙吗?

您可以使用 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 

这是 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 子句中,仅捕获具有净正 "good" 分数的那些。

IF、SUM、COUNT、GROUP BY值得你费心研究一下。它们是 SQL.

非常重要的部分

首先,这种数据库设计在实际数据上并不能很好地工作。您如何评估意见,因为它是自然语言。例如,"This is good but too expensive" 之间有什么区别? "This is not so good but I love culture ..."。

所以你必须提供一种更量化的方式来评估。我建议添加一个名为 "rating" 的列,从 1 星到 5 星。 (5 是最好的)。

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

有了这个设计之后,我们继续追问:最好的地方是什么?

  • 它可以是 5 星评级最多的地方。
  • 这是最高的平均评分。例如:3.5 评分高于 3.0 评分。
  • ...

定义这个metric比较难,依赖于metric,我们会有各自的解决方案。有些解决方案可以使用 SQL 实现,有些解决方案必须使用管道(例如:作业队列来执行一些复杂的评级任务)。

试试这个。

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

希望对你有所帮助。