كيف يمكنني اختيار جميع الإدخالات بأعلى إصدار؟

لدي جدول يسمى documents يحتوي على حقول الهوية والعنوان والإصدار والمحتوى.

الآن أريد الحصول على جميع معرفات (أو صفوف) لكل عنوان بأعلى إصدار.

لنفترض أن لدي البيانات التالية:

+----+-------+---------+---------+
| id | title | version | content |
+----+-------+---------+---------+
|  2 | foo   |       1 | abc1    |
|  3 | foo   |       2 | abc2    |
|  4 | foo   |       3 | abc3    |
|  5 | bar   |       1 | abcd1   |
|  6 | bar   |       2 | abcd2   |
|  7 | baz   |       1 | abcde1  |
+----+-------+---------+---------+

أرغب في تلقي أي من الأعداد 4،6،7 أو الصفوف الكاملة لهذه الإدخالات.

الأداء ليس مشكلة لأنه لن يكون هناك سوى بضع مئات من الإدخالات.

0
في هذه الحالة أستخدم Sqlite3
وأضاف المؤلف ayckoster, مصدر
يمكنك تجميعها. مثال رائع هنا: stackoverflow.com/questions/3998529/&hellip؛
وأضاف المؤلف David Manheim, مصدر
ما RDBMS الذي تستخدمه؟
وأضاف المؤلف Philip Kelley, مصدر

4 إجابة

سيحصل هذا على المعرفات التي تريدها:

  Select max(id) as id from documents
group by title
  having count(1) = max(version)
order by id
0
وأضاف

هذه مجموعة بسيطة من خلال:

select max(version)
from documents
group by title

يمكنك الرجوع إلى المستندات ، إذا أردت ، للحصول على معلومات المستند بالكامل.

0
وأضاف

لاسترداد الصفوف بأكملها ، تحتاج إلى إصدار GROUP BY مع تجميع MAX() ، والانضمام إليه كطلب فرعي مقابل الجدول بالكامل لسحب الأعمدة المتبقية. يجب أن يكون شرط JOIN ضد مجموعة title ، version لأنهما معاً يحددان بشكل فريد الإصدار الأكبر من العنوان.

يجب أن يعمل ما يلي بشكل مستقل عن RDBMS الذي تستخدمه:

SELECT 
  documents.id,
  documents.title, 
  documents.version,
  documents.content
FROM 
  documents
  JOIN (
    /* subquery pulls greatest version per title */
    SELECT
      title,
      MAX(version) AS version
    FROM documents
    GROUP BY title
    /* title, version pair is joined back against the main table */
  ) maxversions ON (documents.title = maxversions.title AND documents.version = maxversions.version)
0
وأضاف

كيف حول:

SELECT * FROM dataz
WHERE version IN (
  SELECT TOP 1 version
  FROM dataz
  ORDER BY version DESC
)
0
وأضاف