2010-02-12 15 views
5

Gibi, birden çok tabloya katılabiliyor mysql içinde en iyi 1 satır nasıl seçileceği, SQL Server 2005'te üst anahtar kelime var & her ID/sütunun aşırı almak istiyorum. Limit no ile kısıtlar. satır döndürür bu yüzden sorunumu çözemez.MYSQL top N satırını birden çok tablodan birleştir

+0

Belki bir örnek? – hsz

+0

Evet, soru çok açık değil. Sadece tahmin ettim –

+0

Soru çok açık değil, ama sanırım sık sık ortaya çıkan "grup başına en büyük" problemin başka bir durumu. –

cevap

3
SELECT v.* 
FROM document d 
OUTER APPLY 
     (
     SELECT TOP 1 * 
     FROM version v 
     WHERE v.document = d.id 
     ORDER BY 
       v.revision DESC 
     ) v 

veya

SELECT v.* 
FROM document d 
LEFT JOIN 
     (
     SELECT *, ROW_NUMBER() OVER (PARTITION BY v.id ORDER BY revision DESC) 
     FROM version 
     ) v 
ON  v.document = d.id 
     AND v.rn = 1 

belgeleriniz genellikle birkaç revizyonları ve Tümünü ya da hemen hemen tüm dokümanları seçmek gerekirse ikincisi daha verimlidir; Eğer belgeler birçok revizyona sahipse ya da sadece küçük bir belge alt kümesini seçmeniz gerekiyorsa, daha etkilidir.

Güncelleme:

Maalesef soruyu fark etmedi yaklaşık MySQL olduğunu. MySQL yılında

, bunu bu şekilde yapın:

SELECT * 
FROM document d 
LEFT JOIN 
     version v 
ON  v.id = 
     (
     SELECT id 
     FROM version vi 
     WHERE vi.document = d.document 
     ORDER BY 
       vi.document DESC, vi.revision DESC, vi.id DESC 
     LIMIT 1 
     ) 

hızlı çalışması için version (document, revision, id) bir bileşik endeksi oluşturun.

+0

MySQL, "APPLY" veya "ROW_NUMBER()' (pencere işlevleri) işlevini desteklemez. –

+0

@ Bill: Doğru, 'MySQL' ile ilgili olduğunu fark etmedi. – Quassnoi

+0

Daha sonra yanıt çalışır, ancak bazı satırlar için yalnızca bir kayıt varsa: sürümde belirli bir docID için yalnızca bir kayıt var, bu durumda sorgu için bu ID için satır almazsınız. Geç cevapla/yorum için özür dilerim –

0

Sizi doğru anlıyorsam, sorununuzu da çözmez. üst sınırlamak için tam olarak eşdeğerdir. Aradığın şey ekstremleri istiyorsanız, max() veya min() gibi toplama işlevleridir. örneğin:

select link_id, max(column_a), min(column_b) from table_a a, table_b b 
where a.link_id = b.link_id group by link_id 
İlgili konular