مشكلة مع SQLite استعلام SQL [مكررة]
سؤال
هذا السؤال هو نسخة مطابقة من:
- سكليتي - WHERE & UDFs 4 إجابات
أحاول تشغيل الاستعلام التالي في 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;