حدد أقرب التاريخ والوقت من قائمة جلسات المستخدم المميزة

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

  •  12-09-2019
  •  | 
  •  

سؤال

لدي جدول من جلسات وصول المستخدم التي تسجل نشاط زوار الموقع:

accessid, userid, date, time, url

أحاول استرجاع جميع الجلسات المميزة للمستخدم 1234، وكذلك في أقرب وقت ووقت لكل من تلك الجلسات المميزة.

SELECT 
    DISTINCT accessid, 
    date, 
    time 
FROM 
    accesslog 
WHERE userid = '1234' 
GROUP BY accessid

هذا يعطيني تاريخ ووقت صف عشوائي داخل كل وظيفة مميزة. لقد قرأت عددا من المشاركات التي توصي باستخدام الحد الأدنى () وماكس ()، لذلك حاولت:

SELECT DISTINCT accessid, MIN(DATE) AS date, MIN(TIME) AS time FROM accesslog WHERE userid = '1234' GROUP BY accessid ORDER BY date DESC, time DESC

... وحتى ...

SELECT DISTINCT accessid, MIN(CONCAT(DATE, ' ', TIME)) AS datetime FROM accesslog WHERE userid = '1234' GROUP BY accessid ORDER BY date DESC, time DESC

... لكنني لم أحصل على النتيجة الصحيحة لأرقأ التاريخ والوقت.

ما هي الخدعة لطلب هذا النوع من الاستعلام؟

تعديل -

شيء غريب يحدث ....

يستعد الرمز المنشور أدناه بيل كيروين بشكل صحيح التاريخ والوقت الأقدم للجلسات التي بدأت في 2009-09. ولكن، بالنسبة للجلسات التي بدأت في يوم من الأيام في 2009-2008، فإن الوقت والتاريخ للضرر الأول الذي يحدث في الشهر الحالي هو ما يتم إرجاعه. بمعنى آخر، لا يبدو أن الاستعلام يمتد غضون أشهر!

مثال مجموعة البيانات:

accessid    | userid    | date          | time
1           | 1234      | 2009-08-15    | 01:01:01
1           | 1234      | 2009-09-01    | 12:01:01
1           | 1234      | 2009-09-15    | 13:01:01
2           | 1234      | 2009-09-01    | 14:01:01
2           | 1234      | 2009-09-15    | 15:01:01

على الأقل في جدول بياناتي الفعلي، فإن الاستعلام المنشور أدناه يجد المتابعة باكرا جدا التاريخ والوقت لكل من اثنين من الاتصالات:

accessid    | userid    | date          | time
1           | 1234      | 2009-09-01    | 12:01:01
2           | 1234      | 2009-09-01    | 14:01:01

... وأعتقد أن السبب الوحيد الذي يظهر فيه النتيجة ل AccessIC 2 صحيح لأنه ليس لديه أي يضرب في الشهر السابق.

هل أنا مجنون؟

تحرير 2 -

الجواب نعم، أنا مجنون. يعمل الاستعلام على بيانات العينة أعلاه عند وضعها في جدول من البنية المكررة.

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

accessid                            | date          | time
cbb82c08d3103e721a1cf0c3f765a842    | 2009-08-18    | 04:01:42
cbb82c08d3103e721a1cf0c3f765a842    | 2009-08-23    | 23:18:52
cbb82c08d3103e721a1cf0c3f765a842    | 2009-09-17    | 05:12:16
cbb82c08d3103e721a1cf0c3f765a842    | 2009-09-18    | 06:29:59

... إرجاع الاستعلام قيمة 2009-09-17 كقيمة أقرب عند الاستعلام عن الجدول الأصلي. ولكن، عندما نسخ ........ أوه، كرات.

ذلك لأن الزيارات من 2009-08٪ لديهم فارغة userid حقل.

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

المحلول

هذا هو الاختلاف في مشكلة "أعظم N-Per-group" التي تأتي على Stackoverflow عدة مرات في الأسبوع.

SELECT 
        a1.accessid, 
        a1.date, 
        a1.time 
FROM 
        accesslog a1
LEFT OUTER JOIN
        accesslog a2
  ON (a1.accessid = a2.accessid AND a1.userid = a2.userid
    AND (a1.date > a2.date OR a1.date = a2.date AND a1.time > a2.time))
WHERE a1.userid = '1234'
  AND a2.accessid IS NULL;

الطريقة التي يعمل بها هذه الأعمال هي أننا نحاول إيجاد صف (A2) الذي يحتوي على نفس AccessID و USERID، وتاريخ أو وقت سابق من الصف A1. عندما لا يمكننا العثور على صف سابق، يجب A1 يكون الصف الأول.


إعادة تعليقك، لقد جربتها فقط مع بيانات العينة التي قدمتها. إليك ما أحصل عليه:

+----------+------------+----------+
| accessid | date       | time     |
+----------+------------+----------+
|        1 | 2009-08-15 | 01:01:01 | 
|        2 | 2009-09-01 | 14:01:01 | 
+----------+------------+----------+

أنا أستخدم MySQL 5.0.75 على نظام التشغيل Mac OS X.

نصائح أخرى

جرب هذا

SELECT 
    accessid, 
    date, 
    time 
FROM 
    accesslog 
WHERE userid = '1234' 
GROUP BY accessid
HAVING MIN(date)

سيعود جميع الوصول الفريد مع الحد الأدنى من الوقت لكل مستخدم = "1234".

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