2010-05-12 5 views
1

J'ai actuellement une structure de base de données avec deux tables importantes.SQL Complicated Group/Join by Category

1) Types d'aliments (fruits, légumes, viande)

2) aliments spécifiques (Apple, oranges, carottes, laitue, Steak, porc)

J'essaie actuellement de construire une instruction SQL telle que je peux avoir ce qui suit.

Fruit < Pomme, Orange

Légumes < carottes, laitue

viande < Steak, Port

J'ai essayé d'utiliser une déclaration comme suit

Select * From Food_Type join (Select * From Foods) as Foods on Food_Type.Type_ID = Foods.Type_ID 

mais cela renvoie chaque aliment spécifique, alors que je veux seulement les 2 premiers par catégorie. J'ai donc fondamentalement besoin de ma sous-requête pour avoir une déclaration de limite de sorte qu'elle ne trouve que les 2 premiers par catégorie.

Cependant, si je fais simplement le

Select * From Food_Type join (Select * From Foods LIMIT 2) as Foods on Food_Type.Type_ID = Foods.Type_ID 

suivant Mon instruction renvoie seulement au total 2 résultats.

+2

Quel système de base de données utilisez-vous? – Anonymoose

+0

vérifier http://stackoverflow.com/questions/2596489/how-to-select-the-last-two-records-for-each-topic-id-in-mysql – Salil

+1

la requête pour résoudre ce peut compter sur la syntaxe C'est spécifique à la base de données ou dépend de ce qui est pris en charge dans votre version de base de données. Peu de gens voudront écrire votre requête dans SQL Server pour découvrir que vous utilisez MySQL, c'est pourquoi il est important de lister la base de données que vous utilisez. –

Répondre

1

Répondu here, mais cette réponse était spécifique à mysql à la fin.

Si votre base de données est un plus conforme à la norme, vous pouvez également utiliser PARTITION

Note:

Select * 
From Food_Type join 
    (Select * From Foods LIMIT 2) as Foods on Food_Type.Type_ID = Foods.Type_ID 

(Select * From Foods LIMIT 2) ne retourne que deux enregistrements sur toute la table, la jointure se produit seulement après la requête est retourné.

Pour faire ce que vous en pensez, vous devrez utiliser des sous-requêtes imbriquées.

Select * 
From Food_Type join 
    Foods on Food_Type.Type_ID = Foods.Type_ID 
Where Foods.Foods_ID IN (Select * 
         From Foods AS nested 
         Where nested.Type_ID = Food_Type.Type_ID 
         ORDER BY ? 
         LIMIT 2) 

approche PARTITION/RANK est différent et devrait être plus rapide, si vous besoin d'aide pour nous faire savoir.