SORU
11 ŞUBAT 2009, ÇARŞAMBA


MySQL - bir grup tarafından döndürülen Kontrol

Böyle bir veritabanı tablo var:

id    version_id    field1    field2
1     1             texta      text1
1     2             textb      text2
2     1             textc      text3
2     2             textd      text4
2     3             texte      text5

Mesai saati dışında sormaman değil, bir satır, ve sonra bazı metin veri versiyonlarını içerir.

Bu sorgu ve her bir ıd için en yüksek numaralı sürümü geri dönmek istiyorum. (ikinci ve son satırları sadece üzerinde bu kadar).

Buna rağmen version_id AZA tarafından sipariş ederek grubunu kullanarak denedim ama işe yaramıyor bu yüzden onun gruplandırılmış sonra sipariş gibi görünüyor.

Herkes herhangi bir fikir var mı? Olamaz inanamıyorum!

GÜNCELLEME:

Çalışır, ama bir alt sorgu kullanır, bu ortaya çıkıyor:

SELECT *
FROM (SELECT * FROM table ORDER BY version_id DESC) t1
GROUP BY t1.id

CEVAP
11 ŞUBAT 2009, ÇARŞAMBA


Bir sütun grubu-akıllı en fazla seçilmesi deniyor. Here are several different approaches for mysql.

Bunu yapardım:

SELECT *
FROM (SELECT id, max(version_id) as version_id FROM table GROUP BY id) t1
INNER JOIN table t2 on t2.id=t1.id and t1.version_id=t2.version_id

Bu mysql sorgu için bellek geçici bir tablo oluşturmak olacak olsa da, nispeten daha verimli olacaktır. Zaten bir dizin (ıd, version_id) bu tablo için var sanırım.

Daha fazla veya daha az bu tür bir sorun için bir alt sorgu (semi-joins Bir başka örnek) kullanmak için SQL eksikliği.

Alt sorgular mysql iyi optimize değil ama aralarında alt çok kötü disk yerine bellek yazılı alacak kadar büyük olmadıkları sürece değil. Bu sorguda verilen tek sorgu uzun zaman önce milyonlarca satır olabilir iki değer vermez ama ilk sorguda select * alt sorgu bu sorunu çok daha çabuk zarar verebilir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • amc

    amc

    21 EYLÜL 2005
  • B4ROK

    B4ROK

    1 EKİM 2008
  • michaeljacksonVEVO

    michaeljacks

    2 EYLÜL 2009