recherche

Maison  >  Questions et réponses  >  le corps du texte

Dans MySQL, comment obtenir la ligne de données suivante tout en tenant compte des changements temporels des données lors du tri par colonne de tri ?

D'accord, ma question est un peu spécifique et difficile à expliquer. Je vais donc essayer de le simplifier.

J'ai une table MySQL qui affiche les "astuces" d'un site Web. Les invites sont triées par nombre entier dans la colonne Ordre. Le tableau ressemble donc à ceci : id (incrémentation int), prompt (varchar), order (int).

Maintenant, lorsque la première invite est affichée à l'utilisateur, elle sera affichée jusqu'à ce que l'utilisateur confirme, puis l'invite suivante sera affichée et ainsi de suite.

J'ai proposé une requête pour obtenir le prochain conseil en fonction du dernier conseil confirmé de l'utilisateur :

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

Cette requête est très utile. Cependant, nous devons parfois ajouter une nouvelle invite, généralement pas à la dernière invite, mais quelque part au milieu. Ainsi, par exemple, l'utilisateur a vu la dernière invite dans la commande n°6, mais nous avons ajouté une nouvelle invite à la position n°3. Cette nouvelle invite ne sera jamais affichée à cet utilisateur car nous avons enregistré qu'il a déjà vu l'invite n°6.

Existe-t-il un moyen de gérer ce problème ? Peut-être qu'une ou deux requêtes MySQL seulement sont nécessaires ?

Merci d'avance pour toute aide et conseils.

EDIT : Chaque utilisateur a son propre « Statut consulté ». Nous l'enregistrons simplement dans le $_SESSION['last_seen_item_order'] de PHP.

P粉420958692P粉420958692461 Il y a quelques jours553

répondre à tous(1)je répondrai

  • P粉798343415

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

    Vous ne pouvez pas le gérer selon cette logique.

    Pour cela, vous devez conserver une colonne supplémentaire - seen Si l'utilisateur l'a déjà vuhints,您可以将其设置为1 Votre requête sera donc -

    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

    REMARQUE - C'est ce que je recommande. Vous pouvez avoir bien d’autres idées.

    Edit - Si vous souhaitez conserver les invites par utilisateur, vous pouvez avoir deux options à gérer seen.

    1. Invites vues au format json maintenues pour les utilisateurs.
    2. Créez une table séparée nommée user_hints_see, qui contient id (incrément), user_id, hint_id, user_hints_see的单独表,其中包含id(自增)、user_idhint_idseenColumn.

    répondre
    0
  • Annulerrépondre