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 ?
P粉420958692
P粉420958692 2023-09-07 14:37:40
0
1
527

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粉420958692
P粉420958692

répondre à tous(1)
P粉798343415

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.
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!