Dalam MySQL, bagaimana untuk mendapatkan baris data seterusnya sambil mengambil kira perubahan masa dalam data semasa mengisih mengikut lajur isihan?
P粉420958692
P粉420958692 2023-09-07 14:37:40
0
1
561

Baiklah, soalan saya agak spesifik dan sukar untuk dijelaskan. Jadi saya akan cuba permudahkan.

Saya mempunyai jadual MySQL yang memaparkan "petua" daripada tapak web. Gesaan diisih mengikut integer dalam lajur Pesanan. Jadi jadual kelihatan seperti ini: id (incrementing int), prompt (varchar), order (int).

Sekarang apabila gesaan pertama ditunjukkan kepada pengguna, ia akan ditunjukkan sehingga pengguna mengesahkan, kemudian gesaan seterusnya akan ditunjukkan dan seterusnya.

Saya membuat pertanyaan untuk mendapatkan petua seterusnya berdasarkan petua terakhir pengguna yang disahkan:

SELECT hint FROM hints WHERE `order` > $last_seen_item_order ORDER BY `order` DESC LIMIT 1

Pertanyaan ini sangat berguna. Walau bagaimanapun, kadangkala kita perlu menambah gesaan baharu, biasanya bukan pada gesaan terakhir, tetapi di suatu tempat di tengah. Jadi sebagai contoh, pengguna melihat gesaan terakhir dalam urutan #6, tetapi kami menambah gesaan baharu pada kedudukan #3. Gesaan baharu ini tidak akan ditunjukkan kepada pengguna ini kerana kami telah menyimpan bahawa dia telah melihat gesaan #6.

Adakah cara untuk menguruskan masalah ini? Mungkin hanya satu atau dua pertanyaan MySQL diperlukan?

Terima kasih terlebih dahulu untuk sebarang bantuan dan petua.

EDIT: Setiap pengguna mempunyai "Status Dilihat" mereka sendiri. Kami hanya menyimpannya dalam PHP $_SESSION['last_seen_item_order'].

P粉420958692
P粉420958692

membalas semua(1)
P粉798343415

Anda tidak boleh menguruskannya dengan logik ini.

Untuk ini, anda perlu mengekalkan lajur tambahan - seen Jika pengguna sudah melihatnyahints,您可以将其设置为1 Jadi pertanyaan anda ialah -

SELECT 
   hint 
FROM
  hints 
WHERE 
  `order` > last_seen_item_order
   OR seen = 0 
ORDER BY 
   CASE WHEN `order` > last_seen_item_order THEN `order` END DESC
   CASE WHEN `order` <= last_seen_item_order THEN `id` END ASC
LIMIT 1

NOTA - Inilah yang saya cadangkan. Anda boleh mempunyai banyak idea lain.

Edit - Jika anda ingin mengekalkan gesaan bagi setiap pengguna, maka anda mungkin mempunyai dua pilihan untuk mengekalkan seen.

  1. Dilihat gesaan dalam json format dikekalkan untuk pengguna.
  2. Buat jadual berasingan bernama user_hints_see, yang mengandungi id (kenaikan), user_id, hint_id, user_hints_see的单独表,其中包含id(自增)、user_idhint_idseenColumn.
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan