لا فكرة عن كيفية كتابة استعلام SQL المعقدة
-
12-09-2019 - |
سؤال
لدي بنية DB:
ملف، مستخدم، FILEREVISION (يحتوي على مفتاح خارجي إلى ملف، وعدد العديد من الاتصالات عبر الطاولة المتوسطة للمستخدم).
أريد جلب كل filerevision-s:
- هي الأحدث / الطازجة في ملفاتهم المقابلة
- لديك العديد من رابطين كثيرة للمستخدم الذي ينفذ البحث (فحص الأذن).
اكتشفت أنني أستطيع أن أفعل (1) من خلال تنفيذ شيء مثل:
SELECT created_on, file_id FROM FileRevision
WHERE created_on = (SELECT MAX(created_on) FROM FileRevision
WHERE filed_id = file_id)
ولكن ليس لدي أدنى فكرة عن كيفية أداء في وقت واحد أيضا إذن M2M
المحلول
هذا هو الاختلاف في مشكلة "أعاة N-Per-Per-group". إليك كيف أحلها بدون مقابل GROUP BY
:
SELECT f1.*
FROM Permissions p -- this is the many-to-many table
JOIN FileRevision f1
ON (f1.file_id = p.file_id)
LEFT OUTER JOIN FileRevision f2
ON (f2.file_id = p.file_id AND f1.created_on < f2.created_on)
WHERE p.user_id = ? AND f2.file_id IS NULL;
استبدال معرف المستخدم المرغوب فيه "?
".
نصائح أخرى
ما عليك سوى إضافة هذا إلى استفسارك:
UNION
SELECT created_on, file_id
FROM FileRevision fr
WHERE fr.user_id = ?
يستبدل ؟ مع أي قيمة تريدها بناء على فحص إذن الخاص بك.
بالإضافة إلى ذلك، إذا قمت باستبدال استفسارك إلى:
SELECT created_on, file_id
FROM FileRevision fr
JOIN
(
SELECT file_id, MAX(created_on) as latestDate
FROM FileRevision
GROUP BY file_id
) latest ON latest.file_id = fr.file_id
AND latest.latestDate = fr.created_on
سوف تتجنب الاسمية الفرعية المرتبطة (التكرار).
للتحقق من perchsissions، تحتاج إلى التحقق من وجود سجل في جدول أذونات كثيرة كثيرة للعديد من الأشخاص الذين يطلبون الملفات. لذا أضف جملة و / أو موجودة ... إذا كنت تريد (كما أظن) فقط المراجعة الأخيرة التي يقوم الطالب بالوصول إليها واستخدامها و.
إذا كنت تريد كل من Rev آخر والسجلات، فإن الطالب لديه حق الوصول إلى أو استخدام أو.
SELECT created_on, file_id
FROM FileRevision r
WHERE created_on =
(SELECT MAX(created_on)
FROM FileRevision
WHERE file_id = r.file_id)
And Exists -- Change 'And' to 'Or if you want both
(Select * From M2MIntermediatePermissionsTable
Where File_Id = r.File_Id
And userId = ?)