Saya memiliki pelanggan meja yang menyimpan customer_id, email dan referensi. Terdapat tabel tambahan customer_data yang menyimpan catatan sejarah dari perubahan yang dilakukan pada pelanggan, yaitu ketika ada perubahan membuat baris baru dimasukkan.
Untuk menampilkan informasi pelanggan dalam sebuah tabel, kedua tabel tersebut perlu digabungkan, namun hanya baris terbaru dari data_pelanggan yang harus digabungkan ke tabel pelanggan.
Ini menjadi sedikit lebih rumit karena kueri diberi nomor halaman, jadi memiliki batas dan offset.
Bagaimana saya bisa melakukan ini dengan MySQL? Saya pikir saya ingin menempatkan DISTINCT di sana di suatu tempat ...
Pertanyaan saat ini adalah seperti ini-
SELECT *, CONCAT(title,' ',forename,' ',surname) AS name
FROM customer c
INNER JOIN customer_data d on c.customer_id=d.customer_id
WHERE name LIKE '%Smith%' LIMIT 10, 20
Selain itu, apakah saya benar dalam berpikir saya dapat menggunakan CONCAT dengan LIKE dengan cara ini?
(Saya menghargai bahwa INNER JOIN mungkin jenis JOIN yang salah untuk digunakan. Saya sebenarnya tidak tahu apa perbedaan antara JOIN yang berbeda. Saya akan memeriksanya sekarang!)
Jawaban:
Anda mungkin ingin mencoba yang berikut ini:
Perhatikan bahwa a
JOIN
hanyalah sinonim dariINNER JOIN
.Kasus cobaan:
Hasil (kueri tanpa
LIMIT
danWHERE
):sumber
Jika Anda bekerja dengan kueri yang berat, lebih baik Anda memindahkan permintaan untuk baris terbaru di klausa where. Ini jauh lebih cepat dan terlihat lebih bersih.
sumber
sql_no_cache set
), sedangkan melakukan pencarian dalam gabungan membutuhkan beberapa detik untuk menyelesaikannya. Masih bingung, tapi maksud saya Anda tidak bisa membantah hasil seperti itu.Menganggap kolom autoincrement di
customer_data
diberi namaId
, Anda dapat melakukan:sumber
Bagi siapa pun yang harus bekerja dengan versi MySQL yang lebih lama (sebelum 5.0 ish), Anda tidak dapat melakukan sub-kueri untuk jenis kueri ini. Berikut adalah solusi yang dapat saya lakukan dan tampaknya berhasil dengan baik.
Pada dasarnya ini adalah menemukan id maksimum dari tabel data Anda menggabungkannya ke pelanggan kemudian menggabungkan tabel data ke id maksimum yang ditemukan. Alasannya adalah karena memilih maksimal grup tidak menjamin bahwa sisa data cocok dengan id kecuali Anda menggabungkannya kembali ke dirinya sendiri.
Saya belum menguji ini pada versi MySQL yang lebih baru tetapi berfungsi pada 4.0.30.
sumber
EXPLAIN
menunjukkan bahwa ini menggunakan tabel sementara dan filesort. MenambahkanORDER BY NULL
di akhir menyingkirkan filesort.SELECT *, MAX(firstData.id), MAX(secondData.id) [...]
. Logikanya, dengan mengubah keSELECT main.*, firstData2.*, secondData2.*, MAX(firstData.id), MAX(secondData.id), [...]
saya bisa membuatnya lebih cepat secara signifikan. Ini memungkinkan gabungan pertama untuk membaca hanya dari indeks, daripada juga harus membaca semua data dari indeks utama. Sekarang solusi cantik hanya membutuhkan 1,9 kali selama solusi berbasis subquery.Saya tahu pertanyaan ini sudah lama, tetapi mendapat banyak perhatian selama bertahun-tahun dan saya pikir itu kehilangan konsep yang dapat membantu seseorang dalam kasus serupa. Saya menambahkannya di sini demi kelengkapan.
Jika Anda tidak dapat mengubah skema database asli Anda, maka banyak jawaban bagus telah disediakan dan menyelesaikan masalah dengan baik.
Namun, jika Anda dapat mengubah skema, saya sarankan untuk menambahkan bidang di
customer
tabel Anda yang menyimpan rekorid
terbarucustomer_data
untuk pelanggan ini:Menanyakan pelanggan
Membuat kueri semudah dan secepat mungkin:
Kekurangannya adalah kerumitan ekstra saat membuat atau memperbarui pelanggan.
Memperbarui pelanggan
Setiap kali Anda ingin memperbarui pelanggan, Anda memasukkan catatan baru di
customer_data
tabel, dan memperbaruicustomer
catatan.Menciptakan pelanggan
Membuat pelanggan hanyalah masalah memasukkan
customer
entri, lalu menjalankan pernyataan yang sama:Membungkus
Kompleksitas ekstra untuk membuat / memperbarui pelanggan mungkin menakutkan, tetapi dapat dengan mudah diotomatiskan dengan pemicu.
Terakhir, jika Anda menggunakan ORM, ini bisa sangat mudah dikelola. ORM dapat menangani penyisipan nilai, memperbarui id, dan menggabungkan dua tabel secara otomatis untuk Anda.
Berikut adalah tampilan
Customer
model Anda yang bisa berubah :Dan
CustomerData
model Anda yang tidak dapat diubah , yang hanya berisi getter:sumber
saya rasa Anda perlu mengubah c.customer_id menjadi c.id
lain memperbarui struktur tabel
sumber
Anda juga bisa melakukan ini
sumber
Ada baiknya Anda memasukkan data aktual ke dalam tabel " customer_data ". Dengan data ini Anda dapat memilih semua data dari tabel "customer_data" sesuai keinginan.
sumber