有没有办法输出具有更多实例的值?
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
希望对你有所帮助。
我正在使用 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
希望对你有所帮助。