سؤال

باعتباري مبتدئًا في Postgresql (سأنتقل لأنني أنقل موقعي إلى Heroku الذي يدعمه فقط، يتعين علي إعادة صياغة بعض استفساراتي وأكوادها.إليك مشكلة لا أستطيع فهم المشكلة تمامًا:

PGError: ERROR:  column "l_user_id" does not exist
LINE 1: ...t_id where l.user_id = 8 order by l2.geopoint_id, l_user_id ...
                                                             ^

...استفسار:

   select distinct 
          l2.*, 
          l.user_id as l_user_id, 
          l.geopoint_id as l_geopoint_id 
     from locations l 
left join locations l2 on l.geopoint_id = l2.geopoint_id 
    where l.user_id = 8 
 order by l2.geopoint_id, l_user_id = l2.user_id desc

تمت إضافة الجملة "l.user_id as l_user_id, l.geopoint_id as l_geopoint_id" لأنه من الواضح أن postgres لا يحب عبارات الترتيب مع الحقول غير المحددة.لكن الخطأ الذي أتلقىه الآن يجعل الأمر يبدو وكأنني لا أحصل على اسم مستعار أيضًا.أي شخص لديه خبرة postgres يرى المشكلة؟

من المحتمل أن أواجه مجموعة من هذه المشكلات - لقد عملت الاستعلامات بشكل جيد في mySql...

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

المحلول

في PostgreSQL، لا يمكنك استخدام التعبير باستخدام اسم مستعار بالترتيب.فقط الأسماء المستعارة البسيطة تعمل هناك.يجب أن يبدو الاستعلام الخاص بك كما يلي:

   select distinct 
          l2.*, 
          l.user_id as l_user_id, 
          l.geopoint_id as l_geopoint_id 
     from locations l 
left join locations l2 on l.geopoint_id = l2.geopoint_id 
    where l.user_id = 8 
 order by l2.geopoint_id, l.user_id = l2.user_id desc;

أفترض أنك تقصد ذلك l2.user_id=l.user_id يجب أن تذهب أولا.

هذه هي الرسالة ذات الصلة في القائمة البريدية العامة لـ PostgreSQL.ما يلي في توثيق ORDER BY بند:

كل تعبير يمكن أن يكون الاسم أو العدد الترتيبي لـ عمود الإخراج (حدد عنصر القائمة) ، أو يمكن أن يكون تشكل تعبير تعسفي من عمود الإدخال قيم.

لذلك لا توجد أسماء مستعارة عند استخدام التعبير.

نصائح أخرى

لديك:

order by l2.geopoint_id, l_user_id = l2.user_id desc

في الاستعلام الخاص بك.هذا بناء جملة غير قانوني.مسح ال = l2.user_id الجزء (انقله إلى where إذا كان هذا أحد شروط الانضمام) ويجب أن يعمل.

تحديث أدناه حدد (مع = l2.user_id تمت إزالته) يجب أن يعمل بشكل جيد.لقد قمت باختباره (بأسماء جداول/أعمدة مختلفة، بوضوح) على Postgres 8.3

select distinct 
       l2.*, 
       l.user_id as l_user_id, 
       l.geopoint_id as l_geopoint_id 
  from locations l 
  left join locations l2 on l.geopoint_id = l2.geopoint_id 
 where l.user_id = 8 
 order by l2.geopoint_id, l_user_id desc

وأنا واجهت نفس هذه المشكلة باستخدام وظائف من fuzzystrmatch - ولا سيما وظيفة levenshtein. أنا في حاجة إلى كل نوع من المسافة سلسلة، وتصفية النتائج حسب المسافة السلسلة. كنت أحاول في الأصل:

SELECT thing.*, 
levenshtein(thing.name, '%s') AS dist 
FROM thing 
WHERE dist < character_length(thing.name)/2 
ORDER BY dist

ولكن، بطبيعة الحال، وأنا حصلت على "عمود" خطأ حي "غير موجود" من جملة WHERE. حاولت هذا وعملت:

SELECT thing.*, 
(levenshtein(thing.name, '%s')) AS dist 
FROM thing 
ORDER BY dist

ولكن أنا بحاجة إلى أن التأهيل في جملة WHERE. وقال شخص آخر في هذه المسألة أن يتم تقييم جملة WHERE قبل ORDER BY، وبالتالي كان العمود غير موجودة عندما قيمت شرط WHERE. تسير بها هذه النصيحة، وأنا أحسب أن عبارة SELECT متداخلة لا حيلة:

SELECT * FROM 
(SELECT thing.*, 
     (levenshtein(thing.name, '%s')) AS dist 
     FROM thing 
     ORDER BY dist
) items 
WHERE dist < (character_length(items.name)/2)

لاحظ أن يطلب من "البنود" الاسم المستعار الجدول والعمود الاسم المستعار حي يمكن الوصول إليه في الخارجية SELECT لأنها فريدة من نوعها في بيان. انها غير تقليدي بعض الشيء وأنا مندهش أنه يجب أن تكون على هذا النحو في PG - ولكن لا يبدو أن تأخذ الأداء ضرب لذلك أنا راض

و"وأضاف أنه على ما يبدو بوستجرس لا يحب بنود النظام مع الحقول لم يتم تحديد"

و"بقدر ما يذهب النظام من قبل - نعم، الإنترنت (وقواعد البيانات أخرى كثيرة) لا يسمح ترتيب بواسطة الأعمدة التي لم ترد في الفقرة حدد"

وفقط غير صحيح عادي.

و=> SELECT معرف من ORDER BY T1 صاحب LIMIT 5؛

معرف

و30  10  20  50  40 (5 صفوف)

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