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?
4 Réponses :
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
Cmon man, ce n'est pas seulement une question de compte mais la valeur de la note
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?
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).
Eh bien, nous pouvons évaluer «bon» et «pas bon» sans trop de difficulté.
Essayez celui-ci.
SELECT place FROM ratings GROUP BY place ORDER BY COUNT(opinion) DESC LIMIT 1
J'espère que cela vous aidera.
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.