SQL: Jede einfache Möglichkeit, die Ergebnisse zu ordnen ZUERST, DANN Gruppe durch eine andere Spalte?

Sehe ich, dass in SQL, GROUP BY muß vorausgehen, UM DURCH Ausdruck. Bedeutet dies, dass die Sortierung erfolgt nach der Gruppierung verwirft identische Zeilen/Spalten?

Da scheine ich zu brauchen, um Reihen von einer timestamp-Spalte Einer ersten, DANN verwerfen Zeilen mit gleichem Wert in Spalte a Nicht sicher, wie dies zu erreichen...

Ich bin mit MySQL 5.1.41

create table
(
    A int,
    B timestamp
)

Die Daten könnten sein:

+-----+-----------------------+
|  A  |  B                    |
+-----+-----------------------+
|  1  |  today                |
|  1  |  yesterday            |
|  2  |  yesterday            |
|  2  |  tomorrow             |
+-----+-----------------------+

Den Ergebnissen, die ich am Ziel wäre:

+-----+-----------------------+
|  A  |  B                    |
+-----+-----------------------+
|  1  |  today                |
|  2  |  tomorrow             |
+-----+-----------------------+

Grundsätzlich möchte ich die Zeilen mit dem aktuellen timestamp in die Spalte B (denkt UM), und nur eine Zeile für jeden Wert in Spalte A (denken, DISTINCT-oder GROUP BY).

Meinem eigentlichen Projekt-details, wenn Sie diese:

Im wirklichen Leben, ich habe zwei Tabellen - users und payment_receipts.

create table users
(
    phone_nr int(10) unsigned not null,
    primary key (phone_nr)
)

create table payment_receipts
(
    phone_nr int(10) unsigned not null,
    payed_ts timestamp default current_timestamp not null,
    payed_until_ts timestamp not null,
    primary key (phone_nr, payed_ts, payed_until_ts)
)

Den Tabellen können auch andere Spalten, die ich weggelassen alle, die IMO ist hier irrelevant. Als Teil einer mobile-payment-scheme, habe ich senden SMS, um Benutzer über das mobile-Handy-Netz in regelmäßigen Abständen, abhängig natürlich, ob die Zahlung fällig ist oder nicht. Die Zahlung realisiert wird, wenn die SMS gesendet wird, die premium-besteuert. Ich Aufzeichnungen über alle Zahlungen im Zusammenhang mit der payment_receipts Tabelle, für die Buchhaltung, die simuliert einen realen shop, wo sowohl Käufer und Verkäufer erhalten eine Kopie der Quittung, für die Referenz. Diese Tabelle speichert meine (Verkäufer), Kopie der Quittung. Die Kunden die Quittung der empfangenen SMS selbst. Jedes mal, wenn eine SMS gesendet wird (und damit eine Zahlung durchgeführt wird), wird die Tabelle eingefügt, ein Eingang Datensatz, die besagt, wer bezahlt, wenn und "bis Wann". Zu erklären, die letztere, sich vorstellen, ein Abonnement-service, aber eine die sich auf unbestimmte Zeit, bis eine Benutzer-opt-out " explizit, an welchem Punkt der Benutzer-Datensatz wird entfernt. Eine Zahlung ist einen Monat im Voraus, also in der Regel, der Unterschied zwischen den payed_ts und payed_until_ts ist 30 Tage Zeit.

Natürlich habe ich ein batch-job, der ausgeführt wird, jeden Tag und muss wählen Sie eine Liste von Benutzern, die durch monatliche Zahlung als Teil der automatischen Abo-Erneuerung. Link zu dieser den dummy-Beispiel weiter oben, die Telefon-Nummer Spalte phone_nr ist a und payed_until_ts ist b, aber in der aktuellen code gibt es zwei Tabellen, die bringen mich zu dem folgenden Verhalten und seine Auswirkungen: wenn ein Benutzer-Datensatz entfernt wird, der Empfang bleibt für die Buchführung. Also, nicht nur muss ich die Gruppe Zahlungen nach Datum und entsorgen Sie alle, aber die Letzte Zahlung Datum des Eingangs, ich muss auch aufpassen, nicht zu wählen, Quittungen, wo es nicht mehr der passende Benutzer-Datensatz.

Ich bin der Lösung des Problems der Auswahl der Datensätze, die aufgrund der Zahlung durch die Suche nach dem belegen mit den neuesten payed_until_ts - Wert (wie in den meisten Fällen wird es mehrere Zugänge für jeden Handy-Nummer) für jede phone_nr und aus diesen Zeilen, die ich weiter verlassen müssen nur die phone_numbers, wo die payed_until_ts ist älter als die Zeit der batch-job ausgeführt wird. Ich Schleife über die Liste dieser Nummern und verschickt Zahlungen, also eine neue Bestätigung für jedes gesendete SMS, wo payed_ts ist now() und payed_until_ts ist now() + interval 30 days.

The tables may include other rows? Kommen wieder?
Es hätte geschrieben 'Spalten', natürlich. Ich habe korrigiert. Vielen Dank für Flecken es aus.

InformationsquelleAutor amn | 2010-07-31

Schreibe einen Kommentar