2010-08-16 3 views
0

Je suis tout à fait ici. La requête MySql ci-dessous fonctionne pour moi sauf pour deux problèmes.mysql valeur distincte pour le compte

1) Je veux m'assurer qu'un seul résultat par catégorie est affiché (j'ai 5 catégories), j'ai essayé d'utiliser DISTINCT mais je l'ai clairement mal compris.

2) Je veux être en mesure de retourner la valeur howmany en dehors de la requête SQL:

"SELECT DISTINCT category_id, video_id, date_added, COUNT(video_id) AS howmany 
FROM votes 
WHERE date_added BETWEEN SYSDATE() - INTERVAL 7 DAY AND SYSDATE() 
GROUP BY video_id 
ORDER BY howmany DESC, video_id 
LIMIT 5"; 

ma table votes ressemble à ceci:

id | video_id | category_id | date_added 

EDIT: Sortie prévue -

video_id 2 category_id 4 nombre de votes 500

video_id 5 category_id 1 nombre de votes 377

video_id 88 category_id 3 nombre de votes 25

video_id 45 category_id 5 nombre de votes 23

video_id 9 category_id 2 nombre de votes 2

Le la vidéo la mieux votée dans chaque catégorie au cours des 7 derniers jours est affichée.

+0

'DISTINCT' supprime uniquement les doublons de visibilité - en double sens la ligne entière des valeurs sont dupliquées. Si une seule valeur de colonne est différente, cela n'est pas considéré comme un doublon. –

Répondre

2

Vous préférerez sans doute GROUP BY category_id ou GROUP BY category_id, video_id si vous souhaitez réduire davantage les résultats.

+0

Je suis d'accord, mais cela n'affecte-t-il pas la valeur de howmany, ne compte-t-il pas sur la base de toutes les vidéos de cette catégorie? – kalpaitch

+1

Si vous regroupez uniquement par category_id, alors oui. Vous obtiendrez le nombre total de votes vidéo pour chaque catégorie. Si vous regroupez par les deux champs, vous obtiendrez chaque video_id individuel dans chaque catégorie individuelle. –

2

Si vous voulez seulement 1 résultat par catégorie, vous devez grouper par catégorie. Mais comme il peut y avoir plusieurs video_id par catégorie, vous finirez par en obtenir un de manière aléatoire dans la catégorie sauf si vous utilisez GROUP_CONCAT.

Si vous voulez juste pour obtenir un compte distinct d'une valeur de colonne, mettez le mot-clé DISTINCT dans la fonction de comptage:

COUNT(DISTINCT video_id) 
1
SELECT DISTINCT category_id, video_id, date_added, COUNT(video_id) AS howmany 

est fonctionnellement équivalent à

GROUP BY category_id, video_id, date_added, COUNT(video_id) 

Vous avez dit "Je veux m'assurer qu'un seul résultat par catégorie est affiché", donc vous voulez probablement quelque chose comme ceci:

SELECT category_id, video_id, date_added, COUNT(video_id) AS howmany 
FROM votes 
WHERE date_added BETWEEN SYSDATE() - INTERVAL 7 DAY AND SYSDATE() 
GROUP BY category_id 
ORDER BY howmany DESC, video_id 
LIMIT 5; 
1

MySQL n'a pas la fonctionnalité d'analyse que vous souhaitez utiliser pour de telles situations - emploi:

SELECT x.video_id, 
     x.category_id, 
     x.howmany 
    FROM (SELECT t.video_id, 
       t.category_id, 
       COUNT(*) AS howmany, 
       CASE 
       WHEN @category = t.category_id THEN @rownum 
       ELSE @rownum := @rownum + 1 
       END AS rank, 
       @category := t.category_id 
      FROM VOTES t 
      JOIN (SELECT @rownum := 0, @category := -1) r 
     WHERE t.date_added BETWEEN SYSDATE() - INTERVAL 7 DAY AND SYSDATE() 
     GROUP BY t.video_id, t.category_id 
    ORDER BY t.category_id, howmany DESC) x 
WHERE x.rank = 1 
ORDER BY x.howmany DESC 
    LIMIT 5 
+0

Wow - et je n'ai pas la fonctionnalité analytique pour faire face à des situations comme ça non plus. Très sympa mais pas très fonctionnel j'ai peur. Et ne pas vomir d'erreurs. Merci, bien que – kalpaitch

+0

@kalpaitch: Pas d'erreurs, mais il ne retourne pas les données que vous attendez? –

+0

La page va arrêter le chargement, c'est tout. Ne pas retourner les données apparemment. – kalpaitch

Questions connexes