2008-12-04 5 views
1

J'ai la requête suivante qui fonctionne sauf que je voudrais qu'elle se comporte différemment. Maintenant, il recherche toutes les lignes dupliquées sur url et les renvoie dans l'ordre du nombre d'URL dupliquées. J'utilise GROUP_ CONCAT pour séparer tous les différents screen_name.MySQL - Changer la requête pour qu'elle soit distincte sur une seule colonne

Cependant, il peut y avoir plusieurs lignes avec le même URL et le même nom d'écran. Comment faire en sorte qu'il ne récupère que les lignes où screen_name est distinct.

SELECT url, title, GROUP_CONCAT(screen_name) , COUNT(t_uid) 
      FROM `twl_links` 
      WHERE twl_uid =3 
      AND timestamp >= NOW() - INTERVAL 24 HOUR 
      GROUP BY (
      url 
      ) 
      ORDER BY COUNT(t_uid) DESC 

Merci beaucoup,

Ice

Répondre

0

Avez-vous essayé d'utiliser le mot-clé distinct?

http://www.tech-recipes.com/rx/1481/ignore-duplicate-entries-in-mysql-select-using-distinct-keyword/

EDIT:

Voici un autre article montrant où distinct peut être utilisé avec group_concat:

http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html

+0

J'ai mais cela ne fait aucune différence puisque je reçois les URLs et en utilisant GROUP_CONCAT pour les noms d'écran –

+0

J'ai modifié ma réponse pour montrer un autre article qui combine les deux. Ce que je pense vous donnera ce que vous voulez. – AaronS

2

Il ne sait pas exactement ce que vous voulez. Compte tenu de ces données:

t_uid url     title   screen_name 
1  http://google.com/  Google   bob 
2  http://google.com/  Google Search bob 
3  http://google.com/  Google   tom 

Quels sont les résultats attendus? Si vous voulez:

http://www.google.com '???' 'bob,tom' 2 

alors vous pouvez faire une sous-requête SELECT DISTINCT pour supprimer les doublons (que vous mettriez en place de FROM twl_links).

Si vous voulez

http://www.google.com '???' 'bob,tom' 3 

vous pouvez alors faire GROUP_CONCAT(DISTINCT screen_name) pour obtenir cela.

Notez que dans tous les cas, le titre est revenu est ambigu (à moins d'une N: 1 entre l'URL et le titre, ce qui est à moins que chaque URL n'a qu'un seul titre distinct)

Pour votre information, il semble que vous avoir des données redondantes et difficiles à interroger en raison d'un manque de normalisation.

+0

Merci beaucoup. Je suis d'accord que la normalisation serait normalement la meilleure option, mais cette table où les données ne sont stockées que pendant 24 heures, puis supprimé. Par conséquent, j'ai choisi de ne pas mettre les URL et les titres dans une table séparée. –

2

Vous pouvez limiter en utilisant un sous-requête comme ceci:

SELECT t1.url, GROUP_CONCAT(t1.screen_name) , COUNT(*) 
FROM (
    SELECT DISTINCT url, screen_name 
    FROM mytable 
) AS t1 
GROUP BY t1.url 

Il ne vous donne pas le titre, mais étant donné que le titre est pas dans le GROUP BY, il n'a pas vraiment clair moi ce que ce champ reviendrait quand même. Si vous voulez tous les titres de ces URL, vous pouvez joindre la requête ci-dessus avec votre table.

Questions connexes