لقد قمت للتو بالتحديث إلى أحدث إصدار من مستكشف البيانات قبل نشر هذا، وأؤكد أن هذه المشكلة لا تزال موجودة لدي.
في المكون الإضافي لمستكشف البيانات، توجد ميزة تتيح لك عرض الاستعلامات للمجموعات. لقد قمت بذلك للاستعلام الذي يحسب الأيام المتتالية التي تمت زيارتها لأن لدي مستخدمين متعطشين لمعرفة مدى قربهم من شارات “الأيام التي تمت زيارتها xxx”.
يبدو أن الخطأ ناتج عن الطلب المرسل (هنا أعرض مفتش الشبكة على فايرفوكس):
يبدو أنه لا يقوم بتحديث قيم المعلمات أثناء إدخالها (username=null، min_days=10 هي المعلمات الافتراضية عند تحميل الصفحة). تعطي وحدة التحكم أيضًا خطأ “Uncaught TypeError: t is undefined” عند إدخال نص في مربع username أو تغيير قيمة min_days. هذا السطر يسبب الخطأ:
هذا أفضل ما يمكنني فعله لتتبع المشكلة بخلاف إنشاء نسخة من المستودع وتصحيح كل سطر. أردت فقط الإبلاغ عن المشكلة وأيضًا فضولي لمعرفة ما إذا كان الآخرون يواجهون نفس المشكلة.
شكراً @piffy على التقرير. لقد أجرينا مؤخرًا بعض التغييرات على المكون الإضافي data-explorer، لذا قد يكون هذا صحيحًا جدًا. لقد اختبرت استعلامات متعددة باستخدام مدخلات اسم المستخدم ولم أواجه المشكلة المذكورة في OP. هل يمكنك وضع استعلامك هنا حتى أتمكن من اختباره؟
--[params]
-- string :username
-- int :min_days = 10
WITH consecutive_visits AS (
SELECT user_id,
visited_at,
-- The value of s will be the same for each group of consecutive days
visited_at - (DENSE_RANK() OVER (PARTITION BY user_id ORDER BY visited_at))::int s
FROM user_visits
WHERE user_id = (SELECT id FROM users WHERE username = :username)
)
SELECT
MIN(visited_at) period_start,
COUNT(*) AS consecutive_days,
MAX(visited_at) period_end
FROM consecutive_visits
GROUP BY user_id, s
HAVING COUNT(*) >= :min_days
ORDER BY period_start DESC
لقد حاولت مع تمكين الوضع الآمن (الإضافات الرسمية فقط) وما زلت أواجه نفس المشكلة.
كإضافة ممتعة إضافية بينما يتفحص إسحاق ذلك، يمكنك أيضًا استخدام المعلمة user_id للحصول على مربع معلمة إكمال تلقائي رائع. مثال:
-- [params]
-- user_id :user
-- int :min_days = 10
WITH consecutive_visits AS (
SELECT user_id,
visited_at,
-- ستكون قيمة s هي نفسها لكل مجموعة من الأيام المتتالية
visited_at - (DENSE_RANK() OVER (PARTITION BY user_id ORDER BY visited_at))::int s
FROM user_visits
WHERE user_id = :user
)
SELECT
MIN(visited_at) period_start,
COUNT(*) AS consecutive_days,
MAX(visited_at) period_end
FROM consecutive_visits
GROUP BY user_id, s
HAVING COUNT(*) >= :min_days
ORDER BY period_start DESC