2016-05-29 7 views
0

Ich versuche, zwei funktionierende SQL-Anweisungen in eine funktionierende SQL-Anweisung zu kombinieren.Komplexe MySQL-Anweisung verursacht Fehler

Hier sind die beiden SQL-Anweisungen, dass jede Arbeit, wenn separat getan:

Das erste wählt alle Produkte und die Geschäfte, die das Produkt in ist, und die Kategorien, die das Produkt für die Geschäfte, die in sind ein bestimmtes Gebiet. Es dient zur Anzeige der Produkte auf einer Website, dann Auflistung der Geschäfte und Kategorien des Produkts unter jedem Produkt.

SELECT p.p_id, p.`p_name`, p.brand, 
GROUP_CONCAT(DISTINCT CONCAT(c.c_id, ':', c.c_name) SEPARATOR ', ') as categories, 
GROUP_CONCAT(DISTINCT CONCAT(s.s_id, ':', s.s_name) SEPARATOR ', ') as shops 
FROM product p 
INNER JOIN product_category pc on p.p_id = pc.p_id 
INNER JOIN category c ON c.c_id = pc.c_id 
INNER JOIN product_shop ps on p.p_id = ps.p_id 
INNER JOIN shop s ON s.s_id = ps.s_id 
WHERE s.street = 'college hill' 
AND s.city = 'auckland' 
AND s.province = 'auckland' 
AND s.country = 'new zealand' 
AND s.postalCode = '1011' 

Die Ergebnisse meiner Top-SQL-Anweisung wie folgt aussehen:

enter image description here

Wichtig: ich da hinzugefügt Breiten- und Längenfelder zum Shop-Tabelle haben, die für die nächste SQL-Anweisungen wichtig ist in dieser Frage

Diese zweite SQL-Anweisung stammt aus this link that finds the closest 20 shops to a latlong coordinate in a table of shops. Ich habe es geeignet ist, mit meiner Datenbank zu arbeiten:

SELECT s_id, (3959 * acos(cos(radians(-36.8473223 
)) * cos(radians(latitude)) * cos(radians(longitude) - radians(174.744227 
)) + sin(radians(-36.8473223 
)) * sin(radians(latitude)))) AS distance FROM shop HAVING distance < 25 ORDER BY distance LIMIT 0 , 20; 

Es Dieses Ergebnis gibt:

enter image description here

So durch die Heirat diese beiden SQL-Anweisungen, ich kann die Produkte auswählen, die in den Geschäften am nächsten sind eine latlong Koordinate, um die Produkte auf der Website anzuzeigen, und dann ihre Shops und Kategorien für jedes Produkt.

Alles, was ich versuche, ist die Entfernung des Ladens von den angegebenen Längen - und Breitenkoordinaten (vom Benutzer mit einem Google Autocomplete Ort Objekt eingegeben), in den Shop wählen Ergebnisse, denen ich ein Bild von der für die top SQL-Anweisung in dieser Frage. Also fügen Sie in den Shop-Ergebnissen für jeden Shop einfach ein Entfernungsergebnis hinzu, das ungefähr 5.897 entspricht. Und geben Sie die Einträge mit der kürzesten Entfernung zurück.

Hier ist mein aktueller Versuch:

SELECT p.p_id, 
    p.`p_name`, 
    p.brand, 
    GROUP_CONCAT(DISTINCT CONCAT(c.c_id, ':', c.c_name) SEPARATOR ', ' 
    ) as categories, 
    GROUP_CONCAT(DISTINCT CONCAT(s.s_id, ':', s.s_name, ':', 
(3959 * acos(cos(radians(-36.8473223 
    )) * cos(radians(s.latitude)) * cos(radians(s.longitude) - radians(174.744227 
    )) + sin(radians(-36.8473223 
    )) * sin(radians(s.latitude)))) AS distance) SEPARATOR ', ' 
    ) as shops 
    FROM 
    product p 
    INNER JOIN product_category pc on p.p_id = pc.p_id 
    INNER JOIN category c ON c.c_id = pc.c_id 
    INNER JOIN product_shop ps on p.p_id = ps.p_id 
    INNER JOIN shop s ON s.s_id = ps.s_id HAVING distance < 25 ORDER BY distance LIMIT 0 , 20; 

Ich erhalte diese Fehlermeldung:

1583 - Incorrect parameters in the call to native function 'CONCAT'

Was kann ich tun, um den Fehler zu beheben?

Ergebnis aus Antwort unten:

enter image description here

Antwort

1

Sie haben ein "Wie Distance" in Ihrem concat, dann die gorup concat als "Shops" finishing.

Ich habe Ihre Abfrage umgeschrieben. Die PREQUERY von Geschäften berechnet Ihre Entfernung und hat Ihre Grenze von 20 Einträgen ... DANN verbindet es sich mit dem Rest der Kette. Da "Abstand" die berechnete Spalte ist, kann diese nun in Ihrer concat-Anweisung verwendet werden.

SELECT 
     p.p_id, 
     p.p_name, 
     p.brand, 
     GROUP_CONCAT(DISTINCT CONCAT(c.c_id, ':', c.c_name) 
     SEPARATOR ', ') as categories, 
     GROUP_CONCAT(DISTINCT CONCAT(s.s_id, ':', s.s_name, ':', 
     s.distance) SEPARATOR ', ') as shops 
    from 
     (SELECT 
       s_id, 
       s.s_name, 
       (3959 
       * acos(cos(radians(-36.8473223)) 
       * cos(radians(latitude)) 
       * cos(radians(longitude) 
       - radians(174.744227)) 
       + sin(radians(-36.8473223)) 
       * sin(radians(latitude)))) AS distance 
      FROM 
       shop 
      HAVING 
       distance < 25 
      ORDER BY 
       distance 
      LIMIT 
       0, 20) s 
     INNER JOIN product_shop ps 
     ON s.s_id = ps.s_id 
     INNER JOIN product p 
      on ps.p_id = p.p_id 
      INNER JOIN product_category pc 
       on p.p_id = pc.p_id 
       INNER JOIN category c 
        ON pc.c_id = c.c_id 
    group by 
     p.p_id, 
     p.p_name, 
     p.brand 
+0

Wow, fantastisch, danke. Aus irgendeinem Grund bekomme ich nur eine Zeile zurück in den Ergebnissen. Das erwartete Ergebnis ist, dass ich jedes Produkt in der Datenbank zurückbekomme, wie die Reihe, die zurückkam. Das sind ungefähr 16 Produkte, also 16 Reihen wie die, die zurück kamen.Es gibt nur zwei Shops in der Datenbank, die beide im Ergebnis für das zurückgekommene Produkt zurückkamen. Alle Produkte befinden sich entweder in einem oder in beiden Läden. Ich muss nur herausfinden, warum die anderen Produkte in den Ergebnissen nicht zurückgegeben werden. Lassen Sie mich wissen, wenn Sie eine Idee haben, warum es nur eine Reihe dank zurückgibt! – BeniaminoBaggins

+0

Das Ergebnis, dass ich zurück bin, ist am Ende meiner Frage – BeniaminoBaggins

+0

@Beniamino_Baggins, GROUP BY hinzugefügt. Da Ihre ursprüngliche Abfrage keine Gruppe nach hatte, würde sie immer nur eine Zeile über die Gruppe_concat zurückgeben. Probieren Sie es jetzt. – DRapp