2017-07-28 5 views
0

Sagen, ich habe drei Tabellen wie folgt:MySQL nächstgelegenen Standort nur wählen, wenn auch neueste Standort

cities 
------ 
name 
latitude 
longitude 

stalls 
------ 
id 
name 

locations 
--------- 
stall_id 
latitude 
longitude 
date 

Ich möchte die nächsten Stände in eine Stadt innerhalb der letzten 6 Monate zu finden. Dieser Teil ist in Ordnung - ich frage die Tabelle "Ställe/Orte" ab und benutze Haversine, um in die Ferne zu kommen. Alles gut.

Dies ist meine aktuelle Abfrage:

SELECT stalls.name, (3959 * acos(cos(radians($lat)) * cos(radians(locations.lat)) * cos(radians(locations.lng) - radians($lng)) + sin(radians($lat)) * sin(radians(locations.lat)))) AS distance 
FROM locations 
LEFT JOIN stalls ON stalls.id = locations.trader_id 
WHERE locations.added > $date 
HAVING distance < 10 

Es ist jedoch möglich, dass ein Stall mehrere neue Standorte in verschiedenen Städten zu haben und ich möchte nur auf eine Stadt auf dem neuesten Standort übereinstimmen. z.B. Ein Stall kann als New York am nächsten kommen, aber dann wird ein neuer Standort für LA hinzugefügt. Jetzt sollte es nur noch in LA für 6 Monate und nicht New York zeigen - zumindest bis ein anderer Ort hinzugefügt wird. Vorherige Standorte müssen gespeichert werden, damit ich sie nicht löschen kann.

Was ist der beste Weg, dies in einer Abfrage zu tun?

+0

Sie sollten die Abfrage anzeigen, die Sie haben. –

+0

Ich habe die Abfrage – Wazzbast

+0

hinzugefügt. Siehe: [Warum sollte ich ein MCVE für eine scheinbar sehr einfache SQL-Abfrage bereitstellen?] (Https://meta.stackoverflow.com/questions/333952/why-should-) i-provide-an-mcve-for-was-scheint-zu-mir-eine-sehr-einfache-sql-Abfrage) – Strawberry

Antwort

1

Um die jüngeren Lage für jeden Stall zu erhalten:

select l.* 
from locations l 
where l.date = (select max(l2.date) from locations l2 where l2.stall_id = l.stall_id); 

Ich bin nicht sicher, wie diese in Ihre allgemeine Abfrage passt.

+0

Also ich denke, ich könnte etwas Ähnliches in einer Unterabfrage tun, aber würde das unbedingt der beste/effizienteste Weg sein? – Wazzbast

+0

@Wazzbast. . . Es gibt viele Möglichkeiten, dies zu tun. Mit einem Index für "Standorte (Stand_ID, Datum)" sollte dies eine sehr wettbewerbsfähige Leistung haben. –

+0

Ja, das klingt gut. Vielen Dank! – Wazzbast

Verwandte Themen