2012-07-24 4 views
0

J'ai une table des gens de noeud, qui ressemble à peu près comme ceci:Grouper par colonne groupée?

lid nid uid type 
1 23 3 like 
2 23 1 like 
3 49 3 dislike 
4 11 6 like 

lid = ID unique pour ce tableau, JNV = "noeud" (contenu) ID, uid = ID utilisateur et le type est explicite .

Avec cette requête:

SELECT nid, COUNT(lid) AS score, type 
FROM node_likes 
INNER JOIN users ON node_likes.uid = users.uid 
GROUP BY nid, type 

je peux obtenir chaque nœud avec son aversion et comme scores. La jointure interne est non pertinente; certains (dés) "J'aime" proviennent d'utilisateurs qui n'existent plus, et la jointure consiste à les éliminer.

Le résultat ressemble à ceci:

nid score type 
307 4  like 
307 1  dislike 
404 24 like 

Comment puis-je puis sous-groupe cette requête par type, et retourner l'ID de nœud plus haut score pour chaque « comme » le type (comme/aversion)?

Ie.

nid score type 
404 24 like 
307 1  dislike 
+0

ORDER BY partition vous donnera DESC les meilleures années JNV. Je ne suis pas sûr de ce que vous entendez par sous-groupe ... – Vatev

+0

ORDER BY score DESC retournera les scores les plus élevés, quel que soit le type. Je veux qu'il renvoie les scores les plus élevés de chaque type. – felamaslen

+0

confondre, ne devrait pas le meilleur score pour les deux aiment/n'aiment pas va à nid = 404? – ajreal

Répondre

2
SELECT 
    SUBSTRING_INDEX(GROUP_CONCAT(nid ORDER BY likes DESC),',',1) as most_likes_nid, 
    MAX(likes) as most_likes, 
    SUBSTRING_INDEX(GROUP_CONCAT(nid ORDER BY dislikes DESC),',',1) as most_dislikes_nid, 
    MAX(dislikes) as most_dislikes 
FROM (
    SELECT 
     nid, 
     COUNT(IF(type = 'like', 1, null)) as likes, 
     COUNT(IF(type = 'dislike', 1 ,null)) as dislikes 
    FROM node_likes 
    GROUP BY nid 
) as t 
+0

Cela fonctionne. Je n'ai aucune idée de comment (encore), mais ça fonctionne. Merci! – felamaslen

+0

il concatène tous les nids dans le bon ordre et obtient ensuite le premier – Vatev

+0

A la réflexion, il semble que ce soit un * petit * hacky, mais ça fait l'affaire. – felamaslen

0
SELECT nid, COUNT(lid) AS score, type 
    FROM node_likes 
    INNER JOIN users ON node_likes.uid = users.uid 
    GROUP BY nid, type   
    ORDER BY type DESC, score DESC; 

peut faire l'affaire.

+0

Qui ordonne par le score et le type, mais ne supprime pas les résultats étrangers du milieu. C'est-à-dire, s'il y a des posts qui n'ont pas la meilleure note "like", mais qui ont plus de likes que le "nid" le plus haut, ils apparaîtront au-dessus du "naze". – felamaslen

0

Essayez ceci:

SELECT 
    nid, max(score) as score, type 
FROM (
    SELECT nid, COUNT(lid) AS score, type 
    FROM node_likes 
    INNER JOIN users ON node_likes.uid = users.uid 
    GROUP BY nid, type 
) results 
GROUP BY type 
ORDER BY type DESC, score DESC 
+0

C'est très étrange. Il renvoie les scores les plus élevés, mais les nids s'associent à tort. – felamaslen

+0

Ce n'est pas étrange du tout. C'est pourquoi j'ai ajouté les hacks SUBSTRING_INDEX (GROUP_CONCAT ...)) dans ma solution. – Vatev

+0

@Vatev Vous avez raison. Alternativement, ma requête a besoin d'une autre condition pour trouver le 'nid' pour l'association' max (score) '. –

Questions connexes