سؤال

هذا السؤال هو نسخة مطابقة من:

أحاول تشغيل الاستعلام التالي في SQLite 3:

SELECT *,
  DISTANCE(latitude, longitude, ?, ?) AS "distance"
FROM "country"
WHERE "id" NOT LIKE ?
HAVING "distance" <= ?
ORDER BY "distance" ASC;

ولكن يمكنني الحصول على الخطأ التالي:

SQLSTATE[HY000]:خطأ عام:1 مجموعة من شرط قبل بعد

أنا لا أفهم لماذا سكليتي يريد مني أن النتائج المالية للمجموعة ، ولكن لا يزال حاولت التالية:

SELECT *,
  DISTANCE(latitude, longitude, ?, ?) AS "distance"
FROM "country"
WHERE "id" NOT LIKE ?
GROUP BY "id"
HAVING "distance" <= ?
ORDER BY "distance" ASC;

وأنا أيضا حاولت هذه:

SELECT *,
  DISTANCE(latitude, longitude, ?, ?) AS "distance"
FROM "country"
WHERE "id" NOT LIKE ?
GROUP BY "distance"
HAVING "distance" <= ?
ORDER BY "distance" ASC;

لا أخطاء ، ولكن جميع السجلات عاد (حتى تلك التي لها "distance" > ?).كما أنني حاولت القيام:

SELECT *,
  DISTANCE(latitude, longitude, ?, ?) AS "distance"
FROM "country"
WHERE "id" NOT LIKE ?
  AND "distance" <= ?
ORDER BY "distance" ASC;

نفس الإخراج ، جميع السجلات التي تم إرجاعها.لقد مضاعفة فحص - المسافة يجري تحسب بشكل صحيح...ليس لدي أي فكرة ما هو الخطأ مع هذا الاستعلام ، يمكن للشخص مساعدتي ؟

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

المحلول

لا يمكنك تحديد أ HAVING بند دون تحديد أ GROUP BY بند. يستخدم:

  SELECT *, 
         DISTANCE(latitude, longitude, ?, ?) AS dist
    FROM COUNTRY c
   WHERE c.id NOT LIKE ?
     AND DISTANCE(c.latitude, c.longitude, ?, ?) <= ?
ORDER BY dist;

إذا كنت لا ترغب في الاتصال بالمسافة أكثر من مرة ، فيمكنك استخدام مسمة فرعية:

  SELECT x.*
    FROM (SELECT c.*, 
                 DISTANCE(latitude, longitude, ?, ?) AS dist
            FROM COUNTRY c
           WHERE c.id NOT LIKE ?) x
   WHERE x.dist <= ? 
ORDER BY dist;

نصائح أخرى

أفضل (وأسرع) نهج للحد من أسفل مجموعة مختارة قبل تطبيق النظام من قبل.يمكنني استخدام هذا النوع من النهج:

حدد * من المواقع التي abs(خطوط - 51.123) < 0.12 وتقاسم المنافع(الطول - 0.123) < 0.34 الترتيب حسب المسافة(خطوط الطول والعرض ، 51.123, 0.123)

حيث (51.123, 0.123) هو مركز خط العرض / خط الطول نقطة كنت تبحث النسبي ، وقيم 0.12 و 0.34 تستخدم لتضييق نطاق البحث الخاص بك إلى lat/long متر على مجال حجم مناسب (أيمربع من ن كم ن كيلومترا في تلك النقطة على الأرض المجال ، حيث الحجم يعتمد على متوسط التوزيع الجغرافي من المواقع الخاصة بك).يمكنني استخدام درجة طول الصيغ من http://en.wikipedia.org/wiki/Longitude إلى هذه القيم ينبغي أن تعطى نقطة تفتيش الموقف على الأرض المجال.

إنه خطأ في بناء الجملة ، يجب عليك استخدام "مجموعة بواسطة" عند استخدام سبب ،

استعلامك مع Group by IS IS Records يحتوي على ("المسافة">) لأنه ، هناك قاعدة قاعدة بيانات تتطلب أولاً البيانات مع سجلات مطابقة ، فسيؤديها مجموعة بعد ذلك بعد تصفية السجلات عن طريق وجود سبب. لذلك لا تحصل أبدًا على البيانات ("المسافة" <)

الرجاء تصحيح إذا كنت مخطئا

علاوة على الإجابة الصحيحة المذكورة أعلاه ، إذا كنت لا ترغب في الاتصال بوظيفة المسافة مرتين ، راجع الاسم المستعار في الفقرة ، أي:

 SELECT *, 
         DISTANCE(latitude, longitude, ?, ?) AS dist
    FROM COUNTRY c
   WHERE c.id NOT LIKE ?
     AND dist <= ?
ORDER BY dist;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top