SORU
21 Ocak 2010, PERŞEMBE


SQL join: bir-çok ilişkisi son kayıtları seçme

Müşteriler tablosu ve alımları bir tablo yoktur sanırım. Her satın alma bir müşteriye aittir. Bir SELECT deyimi, son satın alma ile birlikte tüm müşterilerin listesini almak istiyorum. En iyi uygulama nedir? Bina dizinler üzerinde herhangi bir tavsiye?

Cevap: bu tablo/sütun adları kullanın lütfen

  • müşteri: ıd, adı
  • satın alın, customer_id, item_id, kimliği tarih

Ve daha karmaşık durumlarda, müşteri tabloya son satın koyarak veritabanı denormalize (performans-bilge) faydalı olur?

Eğer (satın alma) kimliği tarihe göre sıralı olmasını garanti ise, ifadeleri LIMIT 1 gibi bir şey kullanarak basitleştirilmiş olabilir?

CEVAP
21 Ocak 2010, PERŞEMBE


Bu düzenli olarak StackOverflow görünen greatest-n-per-group sorunun bir örnektir.

Ben genelde bu çözümü tavsiye:

SELECT c.*, p1.*
FROM customer c
JOIN purchase p1 ON (c.id = p1.customer_id)
LEFT OUTER JOIN purchase p2 ON (c.id = p2.customer_id AND 
    (p1.date < p2.date OR p1.date = p2.date AND p1.id < p2.id))
WHERE p2.id IS NULL;

Açıklama: p1, p2 satır aynı müşteri ve daha sonraki bir tarihte (veya ilişkilerin durumda, bir sonraki id) ile olmalı. bir satır belirli Bunun doğru olduğunu öğrenirsek, o zaman p1 müşteri için en son satın alma.

Dizinler ile ilgili olarak, sütunlar üzerinde purchase Bileşik Endeksi(customer_id, , *date*11)oluşturmak istiyorum. Yapılacak dış birleşim kapsayan bir dizin kullanmak izin verebilir. Optimizasyon uygulaması bağımlıdır çünkü platform üzerinde test etmeyi unutmayın. Eğer bir İLİŞKİSEL özelliklerini iyileştirme planını analiz etmek için kullanın. E. g. MySQL EXPLAIN.


Bazı insanlar yukarıda Haritayı çözüm yerine alt sorgular kullanmak, ama benim çözüm daha kolay bağlarını çözmek için yapar buluyorum.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • FUzzyBUnnyBOoties

    FUzzyBUnnyBO

    3 EKİM 2007
  • Press Start

    Press Start

    4 HAZİRAN 2006
  • spectragirlz16's channel

    spectragirlz

    22 Ocak 2012