suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Wie erhält man in MySQL die nächste Datenzeile und berücksichtigt dabei zeitliche Änderungen in den Daten beim Sortieren nach der Sortierspalte?

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粉420958692P粉420958692461 Tage vor552

Antworte allen(1)Ich werde antworten

  • P粉798343415

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

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

    为此,您需要维护一个额外的列 - 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列。

    Antwort
    0
  • StornierenAntwort