2012-04-12 3 views
3

Was ich versuche zu tun ist, greifen Einträge aus einer Update-Tabelle in einer MySQL-Datenbank mit PHP. An jeden Eintrag ist ein Zeitstempel angehängt. Zuerst erstelle ich 10 verschiedene Daten aus dem Zeitstempel, erstelle ein neues Array unter Verwendung dieser 10 eindeutigen Daten (ich mache das, weil fetchAll die Daten in ein mehrdimensionales Array legt), dann führe einen weiteren Datenbankaufruf durch und packe alle Einträge mit diesen Daten. Das kann mehr als 10 Einträge zurückgeben. Ich möchte, dass es 10 verschiedene Daten gibt, nicht 10 verschiedene Zeitstempel.MySQL wählen nach eindeutigem Datum, mit Limit am Datum, aber keine Einträge

Zum Beispiel, wenn 2012-03-25 in dem ersten Anruf aus verschiedenen Terminen auftauchen, kann es finden:

2012-03-25 00:58:53 
2012-03-25 00:58:02 
2012-03-25 00:57:20 
2012-03-25 00:56:35 
2012-03-25 00:55:58 
2012-03-25 00:53:20 
2012-03-25 00:52:32 
2012-03-25 00:51:45 

Da die Zeitstempel unterschiedlich sind.

Hier ist der aktuelle Code, den ich benutze, der funktioniert.

$test = $dbh->getArray("SELECT DISTINCT DATE_FORMAT(added, '%Y-%m-%d') AS added FROM db_updates ORDER BY added DESC LIMIT 0,10"); 

foreach ($test as $entry) { 
    list($date) = $entry; 
    $output[] = '\''.$date.'\''; 
} 

$test2 = $dbh->getArray("SELECT * FROM db_updates WHERE DATE_FORMAT(added, '%Y-%m-%d') IN (".implode(',', $output).") ORDER BY added DESC"); 

print_r($test2); 

Dies ergab 33 Ergebnisse.

Nur für den Fall, dass jemand fragt, verwende ich PDO und nicht die MySQL-Funktion in PHP. Dieser Code ist hier:

public function getArray($query) { 
    $result = $this->db->query("$query"); 
    return $result->fetchAll(PDO::FETCH_NUM); 
} 

Das alles funktioniert 100%, und es tut was ich will es zu tun. Meine Frage ist jedoch, ob es eine Möglichkeit gibt, all dies mit nur einem einzigen mysql-Aufruf zu tun, so dass ich nicht zweimal mit einer Schleife in der Mitte anrufen muss.

Ich habe versucht, es herauszufinden, indem ich google und Versuch und Irrtum mit Joins und so ohne Erfolg.

Antwort

3

Es sollte mit einem INNER JOIN arbeiten, und Sie können nur DATE(added) statt DATE_FORMAT() verwenden, um den Zeitanteil der DATETIME- Werte abzustreifen:

SELECT * 
FROM 
    db_updates 
    INNER JOIN (
    /* Subquery returns most recent 10 dates */ 
    SELECT DISTINCT DATE(added) AS added FROM db_updates ORDER BY added DESC LIMIT 0,10 
    /* JOIN between dates */ 
) datelist ON DATE(db_updates.added) = datelist.added 
ORDER BY db_updates.added DESC 
+0

Perfect. Danke :) Müssen noch 7 Minuten warten, bevor ich das als Antwort annehmen kann. – WMI