2009-08-10 13 views
0

Sorry für den schrecklichen Titel, nicht sicher, wie das zu erklären ist. Ich habe eine Abfrage, die wie folgt aussieht:Brauchen Sie Hilfe mit meiner Frage

SELECT `name`, `latitude`, `longitude`, `indoor`, `address`, 
    `phone`, `email`, `website`, `closed` 
FROM rocks INNER JOIN 
    (SELECT DISTINCT id FROM rock_types WHERE type="DWS" or type="Top rope") 
    AS types ON rocks.id=types.id 
WHERE (latitude>-180 AND latitude<180) AND (longitude>-180 AND longitude<180) 

Zusätzlich zu dem, was ich jetzt immer, ich mag die Liste der Typen mit jeder ID verbunden bekommen. Wie kann ich das machen? Dank

+0

Dann sollte Ihr Titel etwas wie „Getting eine Liste von Typen mit jeder ID in SQL zugeordnet“ – random

Antwort

1

Hier ist mein nehmen traditionelle Join-Syntax verwendet:

SELECT rocks.name, 
     rocks.latitude, 
     rocks.longitude, 
     rocks.indoor, 
     rocks.address, 
     rocks.phone, 
     rocks.email, 
     rocks.website, 
     rocks.closed, 
     rock_types.type 

FROM rocks, 
     rock_types 

WHERE rocks.latitude > -180     AND 
     rocks.latitude < 180     AND 
     rocks.longitude > -180     AND 
     rocks.longitude < 180     AND 
     rocks.type_id = rocks_types.id  AND 
     rock_types.type IN ('DWS', 'Top rope') 

Die rocks.id = rocks_types.id funktioniert die Verbindung zwischen den beiden Tabellen.

Hier ist, wie Sie die gleiche Abfrage INNER JOIN mit schreiben kann (beide führt zum gleichen Ergebnis)

SELECT rocks.name, 
     rocks.latitude, 
     rocks.longitude, 
     rocks.indoor, 
     rocks.address, 
     rocks.phone, 
     rocks.email, 
     rocks.website, 
     rocks.closed, 
     rock_types.type 

FROM rocks 
     INNER JOIN rocks_types ON rocks.type_id = rocks_types.id 

WHERE rocks.latitude > -180     AND 
     rocks.latitude < 180     AND 
     rocks.longitude > -180     AND 
     rocks.longitude < 180     AND 
     rock_types.type IN ('DWS', 'Top rope') 

EDIT: Basierend auf Ihren Kommentar, der folgende wird Ihnen eine durch Kommata getrennte Liste von Typen :

SELECT rocks.name, 
     rocks.latitude, 
     rocks.longitude, 
     rocks.indoor, 
     rocks.address, 
     rocks.phone, 
     rocks.email, 
     rocks.website, 
     rocks.closed, 
     (SELECT GROUP_CONCAT(DISTINCT rock_types.type SEPARATOR ',') 
     FROM  rock_types 
     WHERE  rock_types.id = rocks.id    AND 
        rock_types.type IN ('DWS', 'Top rope') 
     GROUP BY rock_types.id 
     ) AS type 

FROM rocks 

WHERE rocks.latitude > -180 AND 
     rocks.latitude < 180  AND 
     rocks.longitude > -180 AND 
     rocks.longitude < 180 
+0

als K du Andrew. Dies würde funktionieren, wenn jedem Stein nur ein Typ zugeordnet wäre. Das ist jedoch nicht immer der Fall. Der Felsen-Tisch ist eine Liste von Felsen, die mit ID indiziert sind. Die Tabelle "rock_types" ordnet die ID 1 oder mehreren Typen zu, sodass beispielsweise id = 1 2 Zeilen in rock_types, 1 für DWS und 1 für das oberste Seil haben kann. Diese Abfrage gibt nur einen von diesen zurück. Ist es möglich, alle mit dieser ID verbundenen Typen zu erhalten? – giroy

+0

Ahhh, sollte das in Ihrer ursprünglichen Frage enthalten. In diesem Fall lass mich das ausarbeiten. –

+0

Ich habe meine Frage mit der Lösung für Ihr Problem bearbeitet. –

0
SELECT `name`, `latitude`, `longitude`, `indoor`, `address`, 
    `phone`, `email`, `website`, `closed`, 
    (SELECT GROUP_CONCAT(type SEPARATOR ',') FROM rock_types 
     WHERE (type="DWS" or type="Top rope") and rock_types.id=rocks.id group by id) types 
FROM rocks 
WHERE (latitude>-180 AND latitude<180) AND (longitude>-180 AND longitude<180)