2009-07-23 10 views
1

Quelle est la meilleure façon d'obtenir une sous-liste de choses?Le moyen le plus efficace pour obtenir des listes?

J'ai deux tables:

create table A (
    id int primary key 
) 

create table B (
    id int primary key, 
    aid int foreign key references A(id), 
    sort_key int 
) 

Je veux obtenir une liste des objets A, avec des sous-objets B, mais seulement les cinq premiers de B.

Disons que A est les gens, et B est le type de nourriture, avec sort_key étant combien une personne aime cette nourriture. Comment puis-je obtenir tout le monde (ou certaines personnes) et leur top 5 des aliments?

Répondre

2

Sur le commentaire précédent si c'est un INT vous ne pouvez pas mettre non numerics là-dedans.

En supposant que les données suivantes:

a 
-- 
id 
1 
2 
3 

b 
------------------------ 
id aid sort_key 
1 1  1 
2 1  2 
3 2  1 
4 3  1 
5 1  3 
6 1  4 
7 1  5 
8 1  6 
9 2  2 
10 2  3 

La requête suivante dans MySQL vous donnerait ceci:

SELECT a.*, 
    (SELECT GROUP_CONCAT(id) AS ids FROM b AS bi WHERE bi.aid = a.id ORDER BY sort_key LIMIT 5) AS ids 
FROM a 

Résultat:

id ids 
1 1,2,5,6,7,8 
2 3,9,10 
3 4 
+0

vous avez une faute de frappe quelque part (id = 1 a 6 ids) mais merci! C'est en fait très proche de ce dont j'ai besoin! – Timmy

1

Cette requête prend la clé de tri est une base, plutôt que zéro:

SELECT a.name 
     b.food 
    FROM A a 
    JOIN B b ON b.aid = a.id 
    WHERE b.sortkey <= 5 
ORDER BY a.name, b.sortkey 
+0

Merci, mais sort_key pourrait être quelque chose, et pas numéroté, bien que je puisse prétraiter les données pour faire quelque chose comme ça. – Timmy

+0

Vous auriez des problèmes à mettre des données qui ne sont pas numériques basées sur votre modélisation - actuellement la colonne est un int;) –

+0

désolé, ne signifie pas non-numérique, mais pas strictement 1,2,3,4,5, qui apparaît être votre logique – Timmy

Questions connexes