2009-11-22 3 views
3

Voici ma requête mysql ci-dessous. Grâce à de nombreuses questions et commentaires utiles, je suis presque à la fin de mon voyage. L'idée derrière cette requête est qu'un utilisateur soumet un lien, l'application insère deux lignes, une dans des liens et une autre dans des votes (un vote par défaut, pourquoi un utilisateur ne voterait-il pas pour sa propre soumission?) Alors chaque vote est juste une autre rangée dans la table des votes avec soit un karma_up ou karma_down égal à 1 (bientôt être changé en karma_delta pour économiser sur la colonne supplémentaire.J'ai aussi l'algorithme de popularité là-dedans qui semble être b0rking ma requête. erreur.Mysql Erreur: # 1247 - Référence 'karma' non pris en charge (référence à la fonction de groupe)

#1247 - Reference 'karma' not supported (reference to group function) 

le point de l'ensemble de la majorité de cette requête est d'obtenir le karma

SELECT links.*, (SUM(votes.karma_up) - SUM(votes.karma_down)) AS karma 
FROM links, votes 
WHERE links.id = votes.link_id 
GROUP BY votes.link_id 
ORDER BY (karma - 1)/POW((TIMESTAMPDIFF(HOUR, links.created, NOW()) + 2), 1.5) DESC 
LIMIT 0, 100 

Sans l'algorithme de popularité de la partie ORDER BY, la requête s'exécute parfaitement, ajoutant le karma sommé de la table votes et virant sur une colonne supplémentaire avec sa valeur.

Répondre

7

Le problème est ici:

`ORDER BY karma... 

Vous ne pouvez pas commander par quelque chose qui est défini comme un alias. Essayez ceci:

`ORDER BY ((SUM(votes.karma_up) - SUM(votes.karma_down)) - 1)/POW((TIMESTAMPDIFF(HOUR, links.created, NOW()) + 2), 1.5) DESC` 

Espérons que la base de données ne puisse pas l'évaluer deux fois. Si ce n'est pas le cas, utilisez un select interne sans l'ordre d'abord pour créer l'alias, puis utilisez un autre select pour commander.

+0

Vraiment? C'est le truc? Je ne peux pas utiliser un alias? Bon sang, vous pourriez juste me suivre pour le karma gratuit. –

+0

@TheLizardKing: Vous pouvez utiliser un alias pour une requête plus simple. (Au moins pour SQL 5.1) –

+1

effectivement vous pouvez commander par un alias. des graduations généralement en retour sont requises autour du nom d'alias. Cependant, pas un alias qui est le résultat d'une fonction de groupe telle que SUM dans ce cas lorsqu'il est combiné avec GROUP BY –

Questions connexes