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
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.
Bir-çok aynı Varlığın ilişkisi Nasıl J...
Metin seçme seçeneği jQuery ile içerik...
SQL sorgu: tablodaki tüm kayıtları en ...
Python katılın, neden dize.liste yerin...
Jquery birinci düzey seçme sadece elem...