我正在使用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还没有足够的经验。有人可以帮忙吗?
答案 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
);
设计完成后,我们会继续提问:最好的地方是什么?
定义此度量标准很困难,并且取决于度量标准,我们将分别解决。可以使用SQL来实现某些解决方案,必须使用管道来实现某些解决方案(例如:作业队列执行一些复杂的任务以进行评分)。
答案 3 :(得分:0)
尝试这个。
SELECT place
FROM ratings
GROUP BY place ORDER BY COUNT(opinion) DESC LIMIT 1
我希望这会有所帮助。