Saya memiliki database dengan 'buku' (cerita pendek untuk anak-anak) dan akan sangat informatif untuk memiliki jumlah kata dari setiap kata dalam buku.
Saya menemukan cara untuk mendapatkan jumlah kata untuk setiap kata menggunakan:
SELECT SUM
(
ROUND
(
(LENGTH(pageText) - LENGTH (REPLACE (pageText, "Word", "")))
/LENGTH("Word")
)
) FROM pages WHERE bookID = id;
Yang bekerja luar biasa untuk menghitung kata-kata. TAPI itu mengharuskan saya membaca setiap buku, dan mengeluarkan setiap kata, dan menjalankannya melalui fungsi itu (saya menyimpannya sebagai Prosedur yang Disimpan.)
Saya memiliki tabel yang berisi setiap kata, tanpa duplikat.
Pertanyaan saya: apakah ada cara saya bisa melakukan semacam "untuk setiap" loop pada tabel Words menggunakan prosedur tersimpan saya?
yaitu. lulus prosedur tersimpan ID buku dan kata dan catat hasilnya. Melakukan SETIAP kata, untuk SETIAP buku. Dengan demikian menghemat banyak waktu manual ... Apakah ini sesuatu yang seharusnya saya lakukan dari sisi DB? Haruskah saya mencobanya dengan PHP?
Jujur setiap masukan sangat dihargai!
sumber
count(explode(' ', $pageText))+1
. Atau sesuatu yang lebih rumit untuk menangani banyak spasi di antara kata-kata, mungkin melibatkanpreg_replace('/\s+/', ' ', $pageText)
1+split(/\s+/, $pageText)
. Angka 1 adalah karena jumlah adalah spasi, bukan kata-kata.Jawaban:
Buat prosedur kedua yang menggunakan dua kursor bersarang.
Kursor dalam prosedur tersimpan memungkinkan Anda untuk melakukan hal yang sangat non-SQL: beralih melalui hasil yang ditetapkan satu baris pada satu waktu, menempatkan nilai-nilai kolom yang dipilih ke dalam variabel dan melakukan sesuatu dengan mereka.
Mereka mudah disalahgunakan, karena SQL, lebih bersifat deklaratif daripada prosedural, biasanya tidak perlu "untuk setiap" operasi tipe, tetapi dalam kasus ini, sepertinya aplikasi yang valid.
Setelah Anda menguasai mereka, kursor mudah, tetapi mereka memang membutuhkan pendekatan terstruktur dalam kode pendukung mereka yang tidak selalu intuitif.
Baru-baru ini saya memberikan beberapa kode "boilerplate" yang cukup standar untuk bekerja dengan kursor untuk memanggil prosedur tersimpan dalam jawaban di Stack Overflow , dan saya akan meminjam sangat banyak dari jawaban itu, di bawah ini.
Menggunakan kursor memerlukan beberapa kode boilerplate standar untuk mengelilinginya.
Anda
SELECT
nilai-nilai yang ingin Anda sampaikan, dari mana pun Anda mendapatkannya (yang bisa berupa tabel sementara, tabel dasar, atau tampilan, dan dapat menyertakan panggilan ke fungsi yang disimpan) dan kemudian memanggil prosedur ada info Anda dengan nilai-nilai itu.Berikut ini adalah contoh kode yang diperlukan secara sintaksis yang valid, dengan komentar untuk menjelaskan apa yang dilakukan setiap komponen.
Contoh ini menggunakan 2 kolom untuk meneruskan 2 nilai ke prosedur yang dipanggil.
Perhatikan bahwa ada peristiwa yang terjadi di sini dalam urutan tertentu karena suatu alasan. Variabel harus dideklarasikan terlebih dahulu, kursor harus dideklarasikan sebelum penangan berlanjut mereka, dan loop harus mengikuti semua hal itu.
Anda tidak dapat melakukan hal-hal yang tidak beres, jadi ketika Anda membuat satu kursor di dalam kursor yang lain, Anda harus mengatur ulang ruang lingkup prosedur dengan membuat kode tambahan di dalam
BEGIN
...END
blok-blok di dalam badan prosedur; misalnya, jika Anda membutuhkan kursor kedua di dalam loop, Anda hanya akan mendeklarasikannya di dalam loop, di dalamBEGIN
...END
blok lain.sumber
BEGIN
/END
, dan secara implisit ditutup ketika mereka keluar dari ruang lingkup ... sehingga menutup kursor tidak sepenuhnya diperlukan. Sebagai praktik, saya menganggap itu tidak dibutuhkan dan tidak memasukkannya, tetapi untuk kelengkapan, saya telah menambahkanCLOSE
pernyataan itu ke jawabannya.