حدد الصفوف باستخدام GROUP BY وHAVING مع الدالة التجميعية

StackOverflow https://stackoverflow.com/questions/5482052

سؤال

لدي طاولة مليئة بمحطات الحافلات.كل محطة لديها line_id, ، أ اتجاه و الإحداثيات (خط العرض و الغاز الطبيعي المسال).

أريد أن يعرض استعلامي أقرب نقطة توقف لكل خط/اتجاه.

SELECT * from stops GROUP BY CONCAT(line_id, direction)

يقوم هذا الاستعلام بتجميع نقاط التوقف الخاصة بي كما هو متوقع.إنه الجزء الآخر الأكثر صعوبة (إرجاع أقرب نقطة توقف)، حيث أنني أحسب المسافة بسرعة باستخدام (لقد استبدلت بعض المتغيرات هنا)

SQRT(POW(111.1819*(45.54182-lat),2)+POW(64.7938007101048*(-73.62934-lng),2))

لقد حاولت إجراء INNER JOIN ولكن لم يحالفني الحظ (لقد استبدلت صيغة المسافة):

SELECT distance-formula as distance1, s1.* from stops s1 INNER JOIN 
(SELECT MIN(distance-formula) AS distance2, line_id, direction FROM stops GROUP BY CONCAT(line_id, direction)) s2 
ON (s1.line_id = s2.line_id AND s1.direction = s2.direction AND s1.distance1 = s2.distance2)

لكنني مستمر في الحصول على عمود "المسافة 1" غير معروف في "جملة التشغيل" خطأ.

لقد بحثت في خيارات أخرى ولكن حقيقة أن المسافة يتم حسابها ضمن الاستعلام تبدو بمثابة كسر حقيقي للصفقة.ما هي خياراتي؟ أحتاج أن يكون استفساري في أسرع وقت ممكن.

هل كانت مفيدة؟

المحلول

لم تختبر:

SELECT * FROM (SELECT distance-formula as distance1, line_id, direction from stops) s1 INNER JOIN (SELECT MIN(distance-formula) AS distance2, line_id, direction FROM stops GROUP BY CONCAT(line_id, direction)) s2 ON (s1.line_id = s2.line_id AND s1.direction = s2.direction AND s1.distance1 = s2.distance2)

أو (لم يتم اختباره أيضًا):

SELECT distance-formula as distance1, s1.* from stops s1 INNER JOIN (SELECT MIN(distance-formula) AS distance2, line_id, direction FROM stops GROUP BY CONCAT(line_id, direction)) s2 ON (s1.line_id = s2.line_id AND s1.direction = s2.direction AND s1.distance - formula = s2.distance2)

لا يمكنك استخدام الاسم المستعار distance1 في جملة Where أو on إلا إذا كان موجودًا في استعلام فرعي مثل المثال الأول.

أيضًا، من أجل تسريع العمليات الحسابية، لا تحتاج إلى أخذ الجذر التربيعي لأي شيء لأن sqrt(x) < sqrt(y) يتضمن x < y

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top