cari

Rumah  >  Soal Jawab  >  teks badan

Dalam MySQL, bagaimana untuk mendapatkan baris data seterusnya sambil mengambil kira perubahan masa dalam data semasa mengisih mengikut lajur isihan?

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粉420958692P粉420958692541 hari yang lalu586

membalas semua(1)saya akan balas

  • P粉798343415

    P粉7983434152023-09-08 10:34:15

    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.

    balas
    0
  • Batalbalas