Necesito resultados inusuales para ordenar mysql

Estoy tratando de ordenar resultados ASCENDIENDO de la fecha actual

esto es lo que estoy usando ahora;

SELECT * FROM friends JOIN bdays ON bdays.user = friends.friendname WHERE username = $userid ORDER BY DATE_FORMAT(date, '%m %d') 

¿algunas ideas?

Ejemplo de ordenar por fecha ahora, ordena los cumpleaños comenzando en enero

lo que necesito, en lugar de comenzar la lista en enero, es comenzar desde la fecha actual.

Entonces, en lugar de;

 January February March April May June July August September November December 

Los ordenará así;

 April (current month/day) May June July August September November December January February March April (all the way up to yesterday) 

Tu podrías intentar:

 ORDER BY DATE_FORMAT(date,'%m %d') < DATE_FORMAT(NOW(),"%m %d"), DATE_FORMAT(date,'%m %d'); 

Primero, ordene por si la fecha es menor que la fecha actual o no, luego ordene por mes y por fecha en orden ascendente.

NOTA Esto se parece al método al que se refería Col. Metralla.

Así es como lo haría:

 SELECT *, (DATE_FORMAT(date, '%j')-DATE_FORMAT(NOW(), '%j')+365)%365 AS d FROM foo ORDER BY d; 

El formato de fecha %j es el día del año, es decir, un número 001 … 366.

Probé esto en algunos datos de muestra y se ordena de la manera que describes: ignora el año y ordena la siguiente fecha que cae después de la fecha actual primero, luego ascendente, y ajusta las fechas anteriores del año.

 +----+------------+------+ | id | date | d | +----+------------+------+ | 5 | 1999-05-15 | 27 | | 6 | 1992-06-15 | 59 | | 7 | 1990-07-15 | 88 | | 8 | 1988-08-15 | 120 | | 9 | 1980-11-15 | 212 | | 1 | 2010-01-15 | 272 | | 2 | 2009-02-15 | 303 | | 3 | 2004-03-15 | 332 | | 4 | 2002-04-15 | 362 | +----+------------+------+ 

algo así como ordenar por if (date_format (date, ‘% m% d’)

Puede intentar:

 SELECT *, DATE_FORMAT(date, '%m %d') as adate FROM friends JOIN bdays ON bdays.user = friends.friendname WHERE username = $userid ORDER BY adate