2010-03-12 24 views
4

J'essaie de sélectionner un enregistrement avec les votes les plus efficaces. Chaque enregistrement a un identifiant, le nombre de upvotes (int) et le nombre de downvotes (int) dans une base de données MySQL.Formant une requête SQL qui sélectionne la différence maximale de deux champs

Je sais que la mise à jour de base, sélectionnez, des requêtes d'insertion mais je ne suis pas sûr de la façon de former une requête qui ressemble à quelque chose comme:

SELECT * 
    FROM topics 
WHERE MAX(topic.upvotes - topic.downvotes) 
+0

Je ne suis pas trop préoccupé par les cravates, s'il y a une cravate que quelqu'un fera. – Frank

Répondre

2

Vous n'utilisez pas droit MAX().

est ici question assez rapide:

SELECT id, (upvotes - downvotes) AS popular 
FROM topics 
ORDER BY popular DESC LIMIT 1 

Pour exécuter une mise à jour:

UPDATE topics, 
    (here you put your select statement from above in parenthesis) AS popular_query 
SET topic.description = "I'm popular" 
WHERE topics.id = popular_query.id 

J'ai juste couru que sur une table avec 250.000 dossiers (il est très similaire - l'utilisation des stocks - la recherche d'un partie la plus populaire) et il a pris .203 d'une seconde - sur ma machine dev - ce n'est même pas le serveur de production (où il tppl 0.016 d'une seconde)

UPD ATE:

Oui, je ne pensais pas à cette possibilité que vous pourriez avoir plus d'un des meilleurs résultats. Popular_ids - contient des enregistrements populaires sous forme de champ de texte, qui peuvent être facilement analysés si nécessaire.

+0

Wow, merci pour l'aide. J'apprécie le repère approximatif.Comment ferais-je une mise à jour sur ce même enregistrement? – Frank

+0

Si vous allez avec la première approche, et ne vous souciez pas que vous pourriez avoir plusieurs résultats, vous pouvez simplement faire et mettre à jour avec select: voir ci-dessus - Je viens de l'éditer. Toutefois, si vous faites une seconde approche, je vous recommande d'analyser les identifiants les plus courants dans la langue de votre choix, et de faire une mise à jour séparée, en mettant à jour tous les enregistrements. – konung

1

Est-ce que faire pour vous?

SELECT * 
FROM topics 
ORDER BY topic.upvotes - topic.downvotes DESC 
LIMIT 1; 
+0

Mais soyez prudent avec ceci, car vous aurez du mal à le commander par ce champ. Vous voudrez peut-être avoir un champ qui stocke upvotes-downvotes, de sorte que vous pouvez l'indexer. –

+0

Cela prend deux à trois fois plus de temps, contrairement à si vous sélectionnez d'abord la différence et commandez par elle. – konung

+0

Pourquoi est-ce Nick? Sur SQL Server, ce ne serait pas différent. Qu'est-ce que MySQL fait différemment? –

2
SELECT (upvotes-downvotes) AS NetVotes, * 
    FROM topics 
    ORDER BY NetVotes DESC LIMIT 1 
3

Il peut y avoir plus d'un enregistrement correspondant à cette condition. Pour les obtenir tous, vous pouvez faire quelque chose comme ça dans mysql:

SELECT * 
    FROM topics 
WHERE upvotes - downvotes = (select MAX(upvotes - downvotes) from topics)