Heim >Backend-Entwicklung >PHP-Tutorial >Wie sollten SQL-Paging-Abfragedaten nach dem Geburtstagsdatum sortiert werden?
Es gibt eine Benutzerdatentabelle user_table
, in der sich ein birthday
-Feld befindet, in dem die Zeitstempeldaten gespeichert werden, die dem Geburtsdatum des Benutzers entsprechen (z. B. 1994-01-01、1996-07-1
)
Jetzt müssen wir die Benutzerdaten auf den Seiten in der Reihenfolge der Geburtstage vom jüngsten zum weitesten durchsuchen.
Wenn heute beispielsweise 2016-07-28
ist, lauten die Geburtstagsdaten 1995-07-30
, 1993-11-31
, 1997-08-29
, 1995-07-27
Die vier Benutzerdaten von
sind sortiert nach 1995-07-30
, 1997-08-29
, 1993-11-31
, 1995-07-27
Wie schreibe ich eine SQL-Anweisung, um solche Abfragebedingungen zu erfüllen?
Oder was sollte die entsprechende Änderung an der Struktur meiner Datentabelle sein, in der Geburtstage gespeichert werden?
Es gibt eine Benutzerdatentabelle user_table
, in der sich ein birthday
-Feld befindet, in dem die Zeitstempeldaten gespeichert werden, die dem Geburtsdatum des Benutzers entsprechen (z. B. 1994-01-01、1996-07-1
)
Jetzt müssen wir die Benutzerdaten auf den Seiten in der Reihenfolge der Geburtstage vom jüngsten zum weitesten durchsuchen.
Wenn heute beispielsweise 2016-07-28
ist, lauten die Geburtstagsdaten 1995-07-30
, 1993-11-31
, 1997-08-29
, 1995-07-27
Die vier Benutzerdaten von
sind sortiert nach 1995-07-30
, 1997-08-29
, 1993-11-31
, 1995-07-27
Wie schreibe ich eine SQL-Anweisung, um solche Abfragebedingungen zu erfüllen?
Oder was sollte die entsprechende Änderung an der Struktur meiner Datentabelle sein, in der Geburtstage gespeichert werden?
Einfacher Ansatz unabhängig von Datenvolumen und Leistungsproblemen:
Fügen Sie ein Feld hinzu, um die Informationen von dayofyear zu speichern. Der Feldname lautet beispielsweise day_of_year, dann sieht Ihre Einfügeanweisung wie folgt aus:
<code class="mysql">insert into user_table set ... = ..., day_of_year = DAYOFYEAR('1995-07-30');</code>
Bei der Abfrage zweimal abfragen, zuerst abfragen, ob das Feld „day_of_year“ größer als Ihr aktueller Wert ist, dann abfragen, ob dieses Feld kleiner als der aktuelle Wert ist, sortieren nach „day_of_year“:
<code class="mysql">select * from user_table where day_of_year >= DAYOFYEAR(CURDATE()) order by day_of_year asc; select * from user_table where day_of_year < DAYOFYEAR(CURDATE()) order by day_of_year asc;</code>
Schauen Sie sich vorher eine Bedingung weniger an
MySQL konvertiert die Zeit 1995-07-30 in den Tag des Jahres DAYOFYEAR('1995-07-30'), subtrahieren Sie den Tag des heutigen Jahres in Days, erhalten Sie einfach ein Unterschied und Reihenfolge nach.
Wenn die Geburtstage im selben Monat und Tag liegen, können Sie sie in aufsteigender Reihenfolge nach Jahr sortieren.
<code>select * from user_table order by (DAYOFYEAR(birthday)-DAYOFYEAR(curdate())),year(birthday) ASC</code>
Idee: Eigentlich sortieren Sie nach der Subtraktion zuerst nach Monat und nach der Subtraktion dann nach Tag
<code>mysql> SELECT name, birthday FROM user_table -> WHERE MONTH(birthday) = MONTH(DATE_ADD(CURDATE(),INTERVAL 1 MONTH)) -> ORDER BY DAY(birthday) asc; </code>
Der obige Code kann die Geburtstagsdaten einen Monat nach dem aktuellen Monat abrufen und in aufsteigender Reihenfolge nach Tagen anordnen. Sie können einfach eine Wiederholung schreiben, um die folgenden herauszunehmen
<code>DROP TEMPORARY TABLE IF EXISTS aa; DROP TEMPORARY TABLE IF EXISTS bb; create temporary table aa(select birthday from user_table WHERE substring(birthday,6,10)>'07-28' ORDER BY substring(birthday,6,10) asc); create temporary table bb(select birthday from user_table WHERE substring(birthday,6,10)<'07-28' ORDER BY substring(birthday,6,10) asc ); SELECT * FROM aa Union All SELECT * FROM bb 测试了一下,效果如图所示</code>
1995-07-30
1997-08-29
1993-11-31
1999-01-01
1995-07-27