2010-07-26 9 views
0

J'ai une tâche très simple, mais je ne trouve aucune solution. J'ai deux tables, 'articles' et 'catégories'comment exclure des lignes qui ont des doublons dans un champ

Mon article regard de la table comme ceci:

id | cat_id | title | content 
1  1  Blah  Content 1 
2  1  Blah2 Content 2 
3  2  Blah3 Content 3 

table à la décoration Mes catégories comme ceci:

id | title 
1  Category 1 
2  Category 2 

Vous voyez que j'ai 2 articles qui ont le même cat_id. Je ne veux pas avec le champ cat_id en double. Je ne peux pas utiliser DISTINCT, parce que j'obtiendrai tous les articles, parce que je veux tous les champs.

donc si je peux utiliser DISTINCT comme ceci:

SELECT DISTINCT a.id, a.cat_id, a.title, a.content des articles en tant que

j'obtenir tout, mais je veux sortie comme ceci

id | cat_id | title | content 
2  1  Blah2 Content 2 
3  2  Blah3 Content 3 

Quelqu'un peut-il m'aider s'il vous plaît !!!

+0

Désolé - Je ne vois pas comment les valeurs ARTICLE.id 1 et 2 sont le même article. Les id sont différents, tout comme les titres ... –

+1

Comment décidez-vous lequel des deux rangs pour le chat 1 que vous voulez? – Tom

Répondre

0

Cette requête sélectionnera le premier article (identifiant le plus bas) de chaque catégorie

SELECT a.* FROM Article a LEFT JOIN 
    Article a2 ON a.id<a2.id AND a.cat_id=a2.cat_id 
WHERE a2.id IS NULL 

Il ne une jointure externe avec tous les autres articles. La clause de jointure ne joint que des articles de la même catégorie et avec un identifiant plus petit. Lorsqu'il n'y a pas de correspondance (a2.id est NULL), nous avons l'article avec l'ID le plus bas pour cette catégorie.

+0

Ça y est, peux-tu m'expliquer comment ça marche? – Tjodalv

+0

J'ai expliqué de mon mieux dans le paragraphe après la requête. Je peux essayer d'élaborer - quelle partie avez-vous des problèmes? – mdma

0

Non testé, mais devrait fonctionner:

; WITH cte AS (
    SELECT 
     * 
     ,ROW_NUMBER() OVER (PARTITION BY cat_id ORDER BY id DESC) AS RowNum 
) 
SELECT 
    * 
FROM cte 
WHERE RowNum = 1; 
0

Essayez ceci:

select article.* 
    from article 
     join (select min(id) as id, cat_id from article group by cat_id) a2 
      using (id); 

ou:

select * 
    from article 
    where id in (select min(id) from article group by cat_id); 

deux sélectionnez un identifiant de l'article (en utilisant min()) pour chaque cat_id distincte et sélectionnez uniquement les enregistrements avec ces ids.