حذف صفوف غير ضرورية من طاولة مع 2 معايير
-
25-09-2019 - |
سؤال
لديّ طاولة علاقات كثيرة إلى حد كبير وأحتاج إلى حذف الصفوف غير الضرورية. ال 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))
لذلك يجب أن يحذف السجلات فقط غير الواردة في الاختيار الذي تحتاجه