سؤال

لدي بنية DB:

ملف، مستخدم، FILEREVISION (يحتوي على مفتاح خارجي إلى ملف، وعدد العديد من الاتصالات عبر الطاولة المتوسطة للمستخدم).

أريد جلب كل filerevision-s:

  1. هي الأحدث / الطازجة في ملفاتهم المقابلة
  2. لديك العديد من رابطين كثيرة للمستخدم الذي ينفذ البحث (فحص الأذن).

اكتشفت أنني أستطيع أن أفعل (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 = ?)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top