2011-10-05 15 views
5

Mi sono imbattuto in un problema che pensavo sarebbe stato facile da risolvere, ma sembra che mi stia facendo impazzire. Quindi, sto cercando di ordinare alcuni record MySQL di volta in volta, e poi li "raggruppo" per data. Ad esempio, ecco la mia dati MySQL:PHP/MySQL: Ordina per ora, poi per data

+----+------------+----------+---------------------------+--------+ 
| id | date  | time  | entry      | status | 
+----+------------+----------+---------------------------+--------+ 
| 21 | 2011-10-05 | 09:42:06 | All systems online.  |  1 | 
| 22 | 2011-10-05 | 09:43:09 | Maintenance starting.  |  2 | 
| 23 | 2011-10-04 | 08:42:06 | Systems online and ready. |  1 | 
| 24 | 2011-10-05 | 09:44:30 | Systems are offline.  |  0 | 
+----+------------+----------+---------------------------+--------+ 

Quindi, la domanda che uso per ottenere tutto ordinato è:

SELECT * FROM status order by date ASC;

che produce i seguenti risultati:

+----+------------+----------+---------------------------+--------+ 
| id | date  | time  | entry      | status | 
+----+------------+----------+---------------------------+--------+ 
| 21 | 2011-10-05 | 09:42:06 | All systems online.  |  1 | 
| 22 | 2011-10-05 | 09:43:09 | Maintenance starting.  |  2 | 
| 24 | 2011-10-05 | 09:44:30 | Systems are offline.  |  0 | 
| 23 | 2011-10-04 | 08:42:06 | Systems online and ready. |  1 | 
+----+------------+----------+---------------------------+--------+ 

L'output PHP è il problema. Così, l'uscita in questo momento è:

4 ott 2011

  • sistemi on-line e pronto. [08:42]

5 ott 2011

  • Tutti i sistemi on-line. [09:42 AM]

  • Inizio manutenzione. [09:43 AM]

  • I sistemi sono offline. [09:44]

quello che voglio l'output di essere:

5 ottobre 2011 - I sistemi sono in linea. [09:44 AM]

  • Inizio manutenzione. [09:43 AM]

  • Tutti i sistemi online. [09:42]

4 ottobre 2011

  • sistemi on-line e pronto. [08:42 AM]

Fondamentalmente, sto volendo tutto raggruppato per data (ultimo per primo) e voglio il tempo più recente in alto, non in basso.

Ecco il mio codice PHP:

function getUpdates() { 
    global $db; 
    $updchk = ""; 
    $entries = $db->GetAll("SELECT * FROM status order by date DESC;"); 
    if (!$entries) { ?> 
     <p>No entries in the database, yet.</p> 
    <?php } else 
    foreach ($entries as $entry) { 
     if (ConvertDate($entry['date']) != $updchk) { ?> 
      <h4><?php echo ConvertDate($entry['date']); ?></h4> 
      <p><?php echo $entry['entry']; ?><span class="timestamp"> [<?php echo strftime('%I:%M %p', strtotime($entry['time'])); ?>]</span></p> 
      <?php $updchk = ConvertDate($entry['date']); ?> 
     <?php } else { ?> 
      <p><?php echo $entry['entry']; ?><span class="timestamp"> [<?php echo strftime('%I:%M %p', strtotime($entry['time'])); ?>]</span></p> 
     <?php } 
    } ?> 
<?php } ?> 

Ogni aiuto è apprezzato.

Grazie!

risposta

18

basta aggiungere una clausola aggiuntiva all'ORDINE BY?

SELECT ... 
FROM status 
ORDER BY `date` DESC, `time` DESC 

è possibile ordinare su tanti (o pochi) i campi che si desidera, anche sulle espressioni arbitrarie se necessario.

+0

Wow, è stato facile. – drewrockshard

+1

+1 per la tua velocità! ;) – JellyBelly

4

modificare la tua ricerca per

SELECT * 
FROM status 
order by `date` desc, `time` desc; 
3

Per ordinare per data allora il tempo in SQL,

SELECT * FROM status ORDER BY date DESC, time DESC; 
3

provare questo:

SELECT * FROM `status` ORDER BY `date`, `time` DESC 
0

SELECT * FROM ordine di stato per data (data di) asc, ora desc;

1
SELECT * FROM `status` ORDER BY `date` DESC, `time` DESC 

lavorerà per il vostro codice

+3

dirci per favore, qual è la differenza tra la tua risposta e una risposta già accettata, corretta, ** postata ANNO FA !!! ** !!! – Wh1T3h4Ck5