2012-04-13 26 views
0

Dieser war schwierig zu quantifizieren, so dass ich nicht diese Frage zum ersten Mal richtig formuliert haben kann.Wählen Sie den vorherigen Datensatz mit mehreren Bedingungen in Mysql

Ich habe eine Tabelle nach einem ähnlichen Format wie folgt aus:

| id | other_id | timestamp | 
| 1 |  1 | 2012-01-01 | 
| 2 |  1 | 2012-01-02 | 
| 3 |  2 | 2012-01-02 | 

Was ich versuche zu tun ist, da die Aufzeichnung mit ‚id‘ 2 und ähnliche Datensätze, für die die ‚id‘ Spalte Wert ist bekannt und ist einzigartig und die "andere_id" bekannt ist entsprechend, wie finde ich, für jeden, die 'ID' des Datensatzes mit der gleichen 'anderen_id', aber die erste niedrigere 'id' als die ich bereits kennt.

z.

$arrKnownIds = array (
0 => array('id'=>2,'other_id'=>1), 
1 => array('id'=>3,'other_id'=>2) 
); 

Mit dieser Info, würde Ich mag eine Abfrage, so dass diese Ergebnisse laufen:

while($row = mysql_fetch_assoc($result)) { 
$arrPreviousIds[$row['other_id']] = $row['id']; 
// having in this case values of: 
// $row['other_id'] = 2; 
// $row['id'] = 1; 
} 

ich, wenn ich dies mit UNION, mehrere PHP-Abfrage bewältigen muß, kann nicht ganz klappen Aussagen oder wenn es einen anderen Weg gibt.

Irgendwelche Gedanken, wie man dieses anpackt, werden sehr geschätzt.

Thanks :)

bearbeiten - Die ursprüngliche Abfrage nimmt die folgende Form:

SELECT DISTINCT(`other_id`), MAX(`id`), MAX(`timestamp`) 
FROM `event` 
GROUP BY `other_id` 
ORDER BY `id` DESC, `other_id` ASC 
LIMIT 0, 10 

// Hier werden die letzten 10 einzigartige Events bekommen soll und finden, wenn sie aufgetreten sind.

// Von diesem versuche ich dann herauszufinden, wann sie vorher aufgetreten sind.

+0

Ich bin mir nicht sicher, ob ich verstehe, was Sie wollen. Bei ID 2 sollte ID 1 zurückgegeben werden, weil es die höchste ID ist, die kleiner als 2 ist, mit other_id = 1. Stimmt das? Also, gegeben ID 3 sollte es null zurückgeben, da es keine untere ID mit other_id = 2 gibt? – nnichols

+0

@nnichols, Ja - das ist genau richtig, wie Sie es beschrieben haben. – MyStream

Antwort

1

Wie wäre es damit?

SELECT t1.id, (SELECT id 
       FROM tbl t2 
       WHERE t2.other_id = t1.other_id 
       AND t2.id < t1.id 
       ORDER BY t2.id DESC 
       LIMIT 1) 
FROM tbl t1 
WHERE t1.id IN (1,2,3) 

Es gibt effizientere Möglichkeiten, dies zu tun, wenn Sie mit großen Ergebnismengen arbeiten. Können Sie genau erklären, wie Sie diese Abfrage verwenden werden?

UPDATE - basierend auf Zugabe von bestehenden Abfrage hier ist eine aktualisierte Abfrage in Frage zu stellen, die beide zu kombinieren -

SELECT tmp.*, (SELECT `timestamp` 
       FROM `event` 
       WHERE `event`.`other_id` = `tmp`.`other_id` 
       AND `event`.`id` < `tmp`.`id` 
       ORDER BY `event`.`id` DESC 
       LIMIT 1) AS `prev_timestamp` 
FROM (
    SELECT `other_id`, MAX(`id`) AS `id`, MAX(`timestamp`) AS `timestamp` 
    FROM `event` 
    GROUP BY `other_id` 
    ORDER BY `id` DESC, `other_id` ASC 
    LIMIT 0, 10 
) tmp 

ich das nicht versucht, aber es sollte das gewünschte Ergebnis.

+0

Yup, ich suche nach bestimmten Ereignissen, die zu bestimmten Zeiten aufgezeichnet werden, die das erste Array füllen, und schaue dann zurück, um zu sehen, wann dieses Ereignis vorher aufgetreten ist, sodass ich für jedes einzelne Ereignis die Zeit dazwischen angeben kann Sie. Jedes Ereignis hat eine andere ID und der Zeitraum wird verwendet, um zu bestimmen, wo das erste Spiel zu finden ist. Auf dieser Grundlage finden Sie das vorherige Spiel. – MyStream

+0

In diesem Fall liegt die Ergebnismenge in der Größenordnung von 10-100, aber der zu durchsuchende Datensatz liegt in der Größenordnung von 10M, also wollte ich im schlimmsten Fall (oder 10 davon) die Datenbank nicht 100 Mal treffen Sache), aber die IN-Syntax ist in dieser Situation durchaus machbar. – MyStream

+0

Dies sollte dann für Sie funktionieren, aber Sie sollten in der Lage sein, das gesamte Ergebnis in einer Abfrage zu erhalten. Vielleicht sollten Sie Ihre bestehende Anfrage zu Ihrer Frage hinzufügen. Von dem, was Sie gesagt haben, gehe ich davon aus, dass Sie eine Abfrage ausführen und dann die IDs in diese Abfrage übergeben würden. Wenn das der Fall ist, kann es sicherlich in einer Abfrage kombiniert werden. – nnichols

Verwandte Themen