هذا يتطلب التواصل الذاتي إذا كنت تريد القيام بذلك في MySQL. إنه لألم في الرقبة القيام بالضغط ذاتيًا لأن MySQL ليس له وظيفة Rownum. لكنها لا تزال قابلة للتنفيذ.
أولاً ، نحتاج إلى إنشاء مسافة فرعية لإنشاء جدول افتراضي يحاكي SELECT rownum, user, timestamp FROM login
الذي يمكننا أن نفعل مثل هذا. http://sqlfiddle.com/#!2/bf6ef/2/0
SELECT @a:=@a+1 AS rownum, user, timestamp
FROM (
SELECT user, timestamp
FROM login
ORDER BY timestamp
) C,
(SELECT @a:=0) s
بعد ذلك ، نحتاج إلى القيام بالانضمام الذاتي لهذا الجدول الافتراضي إلى نسخة من نفسها. ما نريده في مجموعة النتائج هذه هو قائمة بجميع أزواج الصفوف المتتالية في الجدول. هذا الاستعلام هو كرة شعر - يضع منظم في لغة الاستعلام الهيكلية. ولكنه يعمل. ها هو: http://sqlfiddle.com/#!2/bf6ef/4/0
SELECT first.user AS fuser,
first.timestamp AS ftimestamp,
second.user AS suser,
second.timestamp as stimestamp,
TIMESTAMPDIFF(SECOND, first.timestamp, second.timestamp) AS timeloggedin
FROM (
SELECT @a:=@a+1 AS rownum, user, timestamp
FROM (
SELECT user, timestamp
FROM login
ORDER BY timestamp
) C,
(SELECT @a:=0) s
) AS first
JOIN (
SELECT @b:=@b+1 AS rownum, user, timestamp
FROM (
SELECT user, timestamp
FROM login
ORDER BY timestamp
) C,
(SELECT @b:=0) s
) AS second ON first.rownum+1 = second.rownum
الخدعة الكاملة لمقارنة الصفوف المتتالية هي
SELECT (virtual_table) AS first
JOIN (virtual_table) AS second ON first.rownum+1 = second.rownum
نمط الاستعلام. Rownum+1 = Rownum شيء يجمع الصفوف بأرقام صف متتالية معًا.
بعد ذلك ، نحتاج إلى تلخيص نتيجة هذا الاستعلام للحصول على إجمالي الوقت المسجل لكل مستخدم. سوف يعمل مثل هذا:
SELECT user, SUM(timeloggedin) AS timeloggedin
FROM (
/* the self-joined query */
) AS selfjoin
GROUP BY user
ORDER BY user
هذا يبدو هكذا: http://sqlfiddle.com/#!2/bf6ef/5/0
هذا هو الاستعلام كله وضعت معا.
SELECT user, SUM(timeloggedin) AS timeloggedin
FROM (
SELECT first.user AS user,
TIMESTAMPDIFF(SECOND, first.timestamp, second.timestamp) AS timeloggedin
FROM (
SELECT @a:=@a+1 AS rownum, user, timestamp
FROM (
SELECT user, timestamp
FROM login
ORDER BY timestamp
) C,
(SELECT @a:=0) s
) AS first
JOIN (
SELECT @b:=@b+1 AS rownum, user, timestamp
FROM (
SELECT user, timestamp
FROM login
ORDER BY timestamp
) C,
(SELECT @b:=0) s
) AS second ON first.rownum+1 = second.rownum
) AS selfjoin
GROUP BY user
ORDER BY user
إنه ليس بديهية حقيقية بالنسبة لشخص يستخدم في التفكير الإجرائي والخوارزمية. ولكن هذه هي الطريقة التي تفعل بها هذا النوع من المقارنة المتتالية في الصفوف في SQL.