Katakanlah saya memiliki catatan dengan ID 3,4,7,9 dan saya ingin dapat berpindah dari satu ke yang lain dengan navigasi melalui tautan berikutnya / sebelumnya. Masalahnya adalah, saya tidak tahu cara mengambil rekaman dengan ID tertinggi terdekat.
Jadi, ketika saya memiliki catatan dengan ID 4, saya harus dapat mengambil catatan berikutnya yang ada, yang akan menjadi 7. Kueri mungkin akan terlihat seperti
SELECT * FROM foo WHERE id = 4 OFFSET 1
Bagaimana saya bisa mengambil catatan berikutnya / sebelumnya tanpa mengambil seluruh set hasil dan iterasi secara manual?
Saya menggunakan MySQL 5.
Jawaban:
lanjut:
sebelumnya:
sumber
Selain solusi cemkalyoncu :
catatan selanjutnya:
catatan sebelumnya:
sunting: Karena jawaban ini telah mendapatkan beberapa upvotes akhir-akhir ini, saya benar-benar ingin menekankan komentar yang saya buat sebelumnya tentang memahami bahwa colum kunci primer tidak dimaksudkan sebagai kolom untuk mengurutkan berdasarkan, karena MySQL tidak menjamin yang lebih tinggi, otomatis bertambah , nilai harus ditambahkan di lain waktu.
Jika Anda tidak peduli dengan ini, dan hanya perlu catatan dengan yang lebih tinggi (atau lebih rendah)
id
maka ini sudah cukup. Hanya saja, jangan gunakan ini sebagai sarana untuk menentukan apakah suatu catatan benar-benar ditambahkan kemudian (atau lebih awal). Sebagai gantinya, pertimbangkan menggunakan kolom datetime untuk mengurutkan berdasarkan, misalnya.sumber
Semua solusi di atas membutuhkan dua panggilan basis data. Kode sql di bawah ini menggabungkan dua pernyataan sql menjadi satu.
sumber
DISTINCT
sebelum*
akan membuatnya lebih baik, yaitu, tentu saja jikaid
dapat memiliki0
nilai.id
daripada dua.sumber
SELECT * FROM foo WHERE id<4 ORDER BY id DESC LIMIT 1
untuk catatan previouseSaya mencoba melakukan sesuatu yang mirip dengan ini, tetapi saya membutuhkan hasil yang dipesan berdasarkan tanggal karena saya tidak dapat mengandalkan bidang ID sebagai kolom yang dapat diurutkan. Inilah solusi yang saya buat.
Pertama-tama kita mengetahui indeks catatan yang diinginkan dalam tabel, ketika itu diurutkan seperti yang kita inginkan:
Kemudian kurangi hasilnya dengan 2 taruh dalam pernyataan batas. Misalnya di atas mengembalikan 21 untuk saya jadi saya jalankan:
Memberi Anda catatan utama Anda bersama dengan itu berikutnya dan catatan sebelumnya diberikan pesanan Anda.
Saya mencoba melakukannya sebagai panggilan database tunggal, tetapi tidak bisa mendapatkan pernyataan LIMIT untuk mengambil variabel sebagai salah satu parameter itu.
sumber
Coba contoh ini.
Catatan: Jika nilai tidak ditemukan maka akan mengembalikan nol .
Dalam contoh di atas, Nilai sebelumnya akan menjadi Raja dan nilai berikutnya akan menjadi nol karena tidak ada nilai berikutnya.
sumber
Menggunakan pendekatan @Dan, Anda dapat membuat GABUNG. Cukup gunakan @variable yang berbeda untuk setiap sub kueri.
sumber
current
->current_row
&previous
->previous_row
.Baris berikutnya
Baris sebelumnya
contoh baris berikutnya
contoh baris sebelumnya
sumber
Saya memiliki masalah yang sama dengan Dan, jadi saya menggunakan jawabannya dan memperbaikinya.
Pertama pilih indeks baris, tidak ada yang berbeda di sini.
Sekarang gunakan dua pertanyaan terpisah. Misalnya jika indeks baris adalah 21, kueri untuk memilih catatan berikutnya adalah:
Untuk memilih catatan sebelumnya, gunakan kueri ini:
Ingatlah bahwa untuk baris pertama (indeks baris adalah 1), batasnya akan menjadi -1 dan Anda akan mendapatkan kesalahan MySQL. Anda dapat menggunakan pernyataan if untuk mencegah hal ini. Hanya saja jangan memilih apa pun, karena bagaimanapun juga tidak ada catatan sebelumnya. Dalam hal catatan terakhir, akan ada baris berikutnya dan karenanya tidak akan ada hasil.
Juga perlu diingat bahwa jika Anda menggunakan DESC untuk memesan, alih-alih ASC, Anda kueri untuk memilih baris berikutnya dan sebelumnya masih sama, tetapi diaktifkan.
sumber
Ini adalah solusi universal untuk kondisi dengan hasil yang lebih sama.
sumber
Di sini kita memiliki cara untuk mengambil catatan sebelumnya dan berikutnya menggunakan permintaan MySQL tunggal. Di mana 5 adalah id dari catatan saat ini.
sumber
Bagaimana cara mendapatkan catatan berikutnya / sebelumnya di MySQL & PHP?
Contoh saya adalah untuk mendapatkan id saja
sumber
Mengoptimalkan pendekatan @Don hanya menggunakan One Query
ubah CurrentArticleID dengan ID artikel saat ini seperti
sumber
Ada trik lain yang dapat Anda gunakan untuk menampilkan kolom dari baris sebelumnya, menggunakan pemesanan apa pun yang Anda inginkan, menggunakan variabel yang mirip dengan trik @row:
Rupanya, kolom pilih dievaluasi secara berurutan, jadi ini pertama akan memilih variabel yang disimpan, dan kemudian memperbarui variabel ke baris baru (memilih mereka dalam proses).
NB: Saya tidak yakin ini perilaku yang didefinisikan, tetapi saya sudah menggunakannya dan berfungsi.
sumber
Jika Anda ingin memberi makan lebih dari satu
id
ke kueri Anda dan dapatkannext_id
semuanya ...Tetapkan
cur_id
di bidang pilih Anda dan kemudian berikan ke subquery masuk kenext_id
dalam bidang pilih. Dan kemudian pilih sajanext_id
.Menggunakan jawaban longneck untuk calc
next_id
:sumber
sumber
Jika Anda memiliki kolom indeks, katakan id, Anda dapat mengembalikan id sebelumnya dan berikutnya dalam satu permintaan sql. Ganti: id dengan nilai Anda
sumber
Solusi saya untuk mendapatkan catatan berikutnya dan preview juga untuk kembali ke catatan pertama jika saya dengan yang terakhir dan sebaliknya
Saya tidak menggunakan id saya menggunakan judul untuk url yang bagus
Saya menggunakan Codeigniter HMVC
sumber
Inilah jawaban saya. Saya mengambil ide dari ' Decent Dabbler ' dan menambahkan bagian yang memeriksa apakah id antara min (id) dan max (id). Inilah bagian untuk membuat tabel saya.
);
Langkah selanjutnya adalah membuat prosedur tersimpan yang bertanggung jawab untuk mendapatkan id sebelumnya.
Metode pertama baik jika indeks diurutkan, tetapi jika tidak. Misalnya, jika Anda memiliki indeks: 1,2,7 dan Anda harus mendapatkan nomor indeks 2 dengan cara ini, lebih baik menggunakan pendekatan lain.
sumber
100% berfungsi
sumber
Saya pikir untuk memiliki baris nyata berikutnya atau sebelumnya dalam tabel SQL kita perlu nilai nyata dengan sama, (<atau>) mengembalikan lebih dari satu jika Anda perlu mengubah posisi baris dalam tabel pemesanan.
kita perlu nilai
$position
untuk mencarineighbours
baris Di meja saya, saya membuat kolom 'posisi'dan permintaan SQL untuk mendapatkan baris yang diperlukan adalah:
untuk selanjutnya :
untuk sebelumnya:
sumber
Pilih top 1 * dari foo mana id> 4 order oleh id asc
sumber
select * from foo where id>4 order by id asc LIMIT 1