سؤال

لديّ طاولة علاقات كثيرة إلى حد كبير وأحتاج إلى حذف الصفوف غير الضرورية. ال lastviews هيكل الجدول هو:

| user (int) | document (int) | time (datetime) |

يسجل هذا الجدول آخر المستخدمين الذين شاهدوا المستند. (مستخدم ، وثيقة) فريدة من نوعها. أنا أظهر فقط آخر 10 آراء من وثيقة وحتى الآن حذفت غير ضروري مثل هذا:

DELETE FROM `lastviews` WHERE `document` = ? AND `user` NOT IN (SELECT * FROM (SELECT `user` FROM `lastviews` WHERE `document` = ? ORDER BY `time` DESC LIMIT 10) AS TAB)

ومع ذلك ، الآن أحتاج أيضًا إلى إظهار آخر 5 الوثائق أ المستعمل شاهد. هذا يعني أنه لم يعد بإمكاني حذف الصفوف باستخدام الاستعلام السابق لأنه قد يحذف المعلومات التي أحتاجها (قل أن المستخدم لم يشاهد المستندات في 5 دقائق ويتم حذف الصفوف)

خلاصة القول ، أحتاج إلى حذف جميع السجلات التي ليست في نتائج هذين الاستعلامات:

SELECT ... FROM `lastviews` WHERE `document` = ? ORDER BY `time` DESC LIMIT 10

و

SELECT * FROM `lastviews` WHERE `user` = ? ORDER BY `time` DESC LIMIT 0, 5

أنا بحاجة إلى المنطق.

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

المحلول 2

أنا أغلق هذا السؤال. لم أجد الإجابة التي كنت أبحث عنها ولكن انتهت من القيام بذلك بطريقة أخرى. قررت إزالة هذه السجلات التي يبلغ عمرها يومين ، لذا لن يكون هناك أي صفوف غير مستخدمة في قاعدة البيانات.

نصائح أخرى

هل يمكن لـ A OR في استعلامك حل مشكلتك؟

شيء من هذا القبيل:

DELETE FROM `lastviews` WHERE `document` = ? AND (`user` NOT IN (SELECT * FROM (SELECT `user` FROM `lastviews` WHERE `document` = ? ORDER BY `time` DESC LIMIT 10) AS TAB) OR 'user' NOT IN (SELECT * FROM (SELECT 'user' FROM `lastviews` WHERE `user` = ? ORDER BY `time` DESC LIMIT 0, 5) AS TAB))

لذلك يجب أن يحذف السجلات فقط غير الواردة في الاختيار الذي تحتاجه

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