Есть ли способ вывести значение с большим числом экземпляров? - PullRequest
1 голос
/ 09 июня 2019

Я использую 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

Пока яЯ в тупике.Я чувствую, что мне нужно как-то сравнить столбец рейтингов, используя счетчик, но я еще не очень разбираюсь в SQL.Кто-нибудь может помочь, пожалуйста?

Ответы [ 4 ]

1 голос
/ 09 июня 2019

Это работа для IF, и SUM, и GROUP BY. (https://www.db -fiddle.com / ж / qJzieGghoAr1u98cRQ3mBU / 0 )

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

Выражение IF(opinion = 'Good',1,-1) дает 1 или -1 в зависимости от текста столбца рейтинга. Подведение их итогов дает общий товар минус плохое. Помещение всего этого в предложение HAVING с фильтром > 0 захватывает только те, которые имеют чистый положительный «хороший» результат.

Вам стоит потрудиться внимательно изучить IF, SUM, COUNT и GROUP BY. Это очень важные части SQL.

0 голосов
/ 09 июня 2019

попробуйте это.

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

Надеюсь, это поможет.

0 голосов
/ 09 июня 2019

Во-первых, этот дизайн базы данных не очень хорошо работает на реальных данных. Как вы можете оценить мнения, потому что это естественный язык. Например, чем отличаются «Это хорошо, но слишком дорого». «Это не так хорошо, но я люблю культуру ...».

Таким образом, вы должны предоставить более количественную оценку. Я предлагаю добавить столбец с именем «рейтинг» от 1 звезды до 5 звезд. (а 5 лучший).

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

После того, как у вас есть этот дизайн, мы продолжаем задавать вопрос: какое место лучше?

  • это может быть место с наибольшим 5-звездочным рейтингом.
  • это самый высокий средний рейтинг. например: 3,5 рейтинга выше 3,0 рейтинга.
  • ...

Определил, что эта метрика сложная и зависит от метрики, у нас будет соответственно решение. Некоторые решения могут быть реализованы с использованием SQL, некоторые должны использовать конвейер (например, очередь заданий для выполнения сложных задач для оценки).

0 голосов
/ 09 июня 2019

Вы можете использовать счетчик и группировать по и ограничить 1 ордер по счету desc

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 
...