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:
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:
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:
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
Das Ergebnis, dass ich zurück bin, ist am Ende meiner Frage – BeniaminoBaggins
@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