1
votes

Existe-t-il un moyen de générer une valeur avec le plus grand nombre d'instances?

J'utilise MySQL et j'ai du mal à essayer de générer une liste de lieux en fonction de leur classement.

J'essaie de générer un tableau avec une seule colonne (lieu) contenant les noms des lieux qui ont plus de bonnes notes que de mauvaises notes.

Voici mes notes table:

place
-------
Canada

Et voici les données qu'il contient:

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

Ma requête doit renvoyer quelque chose comme ceci: p>

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

Jusqu'à présent, je suis perplexe. Je pense que je devrais en quelque sorte comparer la colonne des notes en utilisant count, mais je ne suis pas encore assez expérimenté en SQL. Quelqu'un peut-il aider s'il vous plaît?


2 commentaires

Vous avez besoin de pondérations pour chaque note afin de pouvoir calculer le score moyen. Comme: bon + pas bon / 2


Salut Shah. O. Jones a déjà donné une réponse parfaite, mais je voudrais attirer votre attention sur la conception de la base de données elle-même. Pour moi, cela semble assez médiocre. N'aurait-il pas plus de sens d'avoir 3 colonnes: place (varchar), good_opinion_cnt (int), bad_opinion_cnt (int). Ensuite, n'autorisez chaque place qu'une seule fois dans le tableau et ajoutez des opinions par incréments aux compteurs.


4 Réponses :


0
votes

vous pouvez utiliser count et group by et limiter 1 order by count desc

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 

ou utiliser une note basée sur bon / pas bon

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


1 commentaires

Cmon man, ce n'est pas seulement une question de compte mais la valeur de la note




0
votes

Premièrement, cette conception de base de données ne fonctionnera pas vraiment bien sur des données réelles. Comment pouvez-vous évaluer les opinions parce que c'est un langage naturel. Par exemple, quelles sont les différences entre «C'est bien mais trop cher». "Ce n'est pas si bon mais j'aime la culture ...".

Vous devez donc fournir un moyen plus quantitatif à évaluer. Je propose d'ajouter une colonne nommée «note» de 1 étoile à 5 étoiles. (et 5 est le meilleur).

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

Après avoir obtenu ce design, nous continuons à nous demander: quel est le meilleur endroit?

  • il peut s'agir de l'endroit avec le plus de 5 étoiles.
  • c'est la note moyenne la plus élevée. Par exemple: note de 3,5 sur 3,0.
  • ...

Défini cette métrique est difficile, et dépend de la métrique, nous aurons respectivement une solution. Certaines solutions peuvent être implémentées en utilisant SQL, certaines solutions doivent utiliser un pipeline (par exemple: une file d'attente de travaux pour effectuer des tâches complexes pour l'évaluation).


1 commentaires

Eh bien, nous pouvons évaluer «bon» et «pas bon» sans trop de difficulté.



0
votes

Essayez celui-ci.

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

J'espère que cela vous aidera.


0 commentaires