Wie erhält man in MySQL die nächste Datenzeile und berücksichtigt dabei zeitliche Änderungen in den Daten beim Sortieren nach der Sortierspalte?
P粉420958692
P粉420958692 2023-09-07 14:37:40
0
1
494

Okay, meine Frage ist etwas spezifisch und schwer zu erklären. Also werde ich versuchen, es zu vereinfachen.

Ich habe eine MySQL-Tabelle, die „Tipps“ von einer Website anzeigt. Die Eingabeaufforderungen werden nach der Ganzzahl in der Spalte „Reihenfolge“ sortiert. Die Tabelle sieht also so aus: id (inkrementierendes int), prompt (varchar), order (int).

Wenn dem Benutzer nun die erste Eingabeaufforderung angezeigt wird, wird sie angezeigt, bis der Benutzer sie bestätigt. Anschließend wird die nächste Eingabeaufforderung angezeigt und so weiter.

Ich habe eine Abfrage erstellt, um den nächsten Tipp basierend auf dem letzten bestätigten Tipp des Benutzers zu erhalten:

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

Diese Abfrage ist sehr nützlich. Allerdings müssen wir manchmal eine neue Eingabeaufforderung hinzufügen, normalerweise nicht an der letzten Eingabeaufforderung, sondern irgendwo in der Mitte. So hat der Benutzer beispielsweise die letzte Eingabeaufforderung in Bestellung Nr. 6 gesehen, aber wir haben an Position Nr. 3 eine neue Eingabeaufforderung hinzugefügt. Diese neue Eingabeaufforderung wird diesem Benutzer nie angezeigt, da wir gespeichert haben, dass er Eingabeaufforderung Nr. 6 bereits gesehen hat.

Gibt es eine Möglichkeit, dieses Problem zu lösen? Vielleicht sind nur ein oder zwei MySQL-Abfragen nötig?

Vielen Dank im Voraus für jede Hilfe und Tipps.

EDIT: Jeder Benutzer hat seinen eigenen „Ansichtsstatus“. Wir speichern es einfach in PHPs $_SESSION['last_seen_item_order'].

P粉420958692
P粉420958692

Antworte allen(1)
P粉798343415

您不能按照这种逻辑来管理它。

为此,您需要维护一个额外的列 - seen 如果用户已经看到了hints,您可以将其设置为1 因此,您的查询将是 -

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

注意 - 这是我建议的做法。您可以有很多其他的想法。

编辑 - 如果您想要按用户维护提示,那么您可能有两个选项来维护seen

  1. 为用户维护json格式的已看到提示。
  2. 创建一个名为user_hints_see的单独表,其中包含id(自增)、user_idhint_idseen列。
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!