2010-02-03 37 views
1

Je ne sais pas Vous cherchez quelques conseils ici ...MySQL - Limite le nombre de lignes dans une jointure?

Je les tableaux suivants:

site_text 
id site_id text date_added 
1 1   ...  2010-02-02 10:01:00 
2 1   ...  2010-02-02 10:01:20 
3 2   ...  2010-02-02 10:01:00 
4 1   ...  2010-02-02 10:01:40 
5 2   ...  2010-02-02 10:02:00 

sites 
id site_name 
1 www.a.com 
2 www.b.com 
.... 

Je suis en train de sélectionner les 2 dernières lignes (triés par date desc) dans site_text pour chaque site . Pouvez-vous le faire avec une requête? Quelque chose comme, mais avez-vous seulement trouver 2 lignes de chaque site?

SELECT * 
    FROM site_text st 
    JOIN sites s ON st.site_id = s.id 
WHERE st.date_added > '2010-02-01 23:32:04' 
ORDER BY s.id, st.date_added DESC 

EDIT: Au final, je rechercherais les lignes 4,2,5,3.

+0

Je ne comprends pas la sortie que vous attendez. –

Répondre

2

Il y a une solution intelligente ici avec CTE, et RANK()OVER DATE_ADDED Pg 8.4 mais parce que vous utilisez MySQL, la seule chose que je peux penser de implique une requête très informatiquement complexe:

-- Select the top date for each site_id 
SELECT DISTINCT id FROM site_text 
    GROUP BY site_id, date_added 
    ORDER BY site_id, date_added 
UNION 
-- Select the top date for each site_id 
SELECT DISTINCT id FROM site_text 
    GROUP BY site_id, date_added 
     -- Excluding the top date. 
    WHERE id NOT IN (
     SELECT DISTINCT id FROM site_text 
     GROUP BY site_id, date_added 
     ORDER BY site_id, date_added 
    ) 
    ORDER BY site_id, date_added 
; 

Moral de l'histoire, utilisez Pg. Il pourrait y avoir une façon plus spécifique à mysql de le faire qui donne un profil de performance plus acceptable.

+0

Wow, c'est cher. Merci pour les conseils. J'ai eu l'intention de vérifier PG pendant un moment. Peut-être que c'est la raison! – frio80

+0

Garçon êtes-vous pour un régal: c'est comme sortir d'un tunnel de sucer. –

+0

Avec une fonction de fenêtre, juste pour référence, je * pense * cela ressemblerait à ceci: SELECT * FROM (texte SELECT, date_added, rank() OVER (PARTITION PAR site_id ORDER BY date_added desc) AS t WHERE t.rank IN (1,2) ', je m'attendrais à ce qu'il tourne> 100 fois plus vite. –