سؤال

إلقاء نظرة على جدول MySQL أدناه المسمى "المقالات":

+----+-----------+---------+------------------------+--------------------------+
| id | articleId | version | title                  | content                  |
+----+-----------+---------+------------------------+--------------------------+
|  1 |         1 | 0.0     | ArticleNo.1 title v0.0 | ArticleNo.1 content v0.0 |
|  2 |         1 | 1.0     | ArticleNo.1 title v1.0 | ArticleNo.1 content v1.0 |
|  3 |         1 | 1.5     | ArticleNo.1 title v1.5 | ArticleNo.1 content v1.5 |
|  4 |         1 | 2.0     | ArticleNo.1 title v2.0 | ArticleNo.1 content v2.0 |
|  5 |         2 | 1.0     | ArticleNo.2 title v1.0 | ArticleNo.2 content v1.0 |
|  6 |         2 | 2.0     | ArticleNo.2 title v2.0 | ArticleNo.2 content v2.0 |
+----+-----------+---------+------------------------+--------------------------+

أنا أحاول التوصل إلى استعلام لإعادة المقالات. حيث تكون المقالات. النسخة القصوى العدد.

يحتوي جدول المقالات الفعلية على أكثر من 10000 إدخال.

لذلك في هذا المثال، أريد فقط أن يتم إرجاع المواد 4 و 6. إيف كنت تبحث في الكلمات الرئيسية متميزة ووظيفة كحد أقصى () ولكن لا يمكن أن يبدو أنه مسمار ذلك.

أي اقتراحات نقدر ...

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

المحلول

تحتاج إلى استعلام فرعي هنا:

SELECT a.id, a.version
FROM articles a
WHERE a.version = (
    SELECT MAX(version)
    FROM articles b
    WHERE b.articleId = a.articleId
)

نصائح أخرى

من mysql دليل, هذا يفعل الخدعة:

SELECT a1.id
FROM Articles a1
LEFT JOIN Articles a2 ON a1.articleId = a2.articleId AND a1.version < a2.version
WHERE a2.articleId IS NULL;

من دليل مرتبط:

ال LEFT JOIN يعمل على أساس ذلك عندما s1.price a1.version هو في لها أقصى الحد الأدنى القيمة، لا يوجد s2.price a2.version مع أكبر أقل القيمة وبالتالي المقابلة s2.article a2.articleId القيمة NULL.

(قمت بتحريرها لجعل نصها تطابق موقفك.)

يمكنك استخدام Sacquery هنا:

select
    a.id
from
    articles a
where
    a.version = (select max(version) from articles)

نظرا لأن هذا ليس استعلام فرعي مرتبط، فسيكون سريعا جدا (بأسرع أو أسرع من الانضمام)، لذلك لا داعي للقلق بشأن ذلك. ولكن سيعود كل القيم التي لها ماكس articleid.

بالطبع، أوصي بإلقاء فهرس articleid (افترض id مجمعة بالفعل). من شأنها أن تساعدها على العودة بشكل أسرع.

كما لوحظ في التعليقات، إذا كنت ترغب في الحصول على الإصدار الأقصى لكل منهما articleid, ، يمكنك القيام بما يلي:

select
    a.id
from
    articles a
    inner join (select articleid, max(version) 
                from articles group by articleid) as b on
        a.articleid = b.articleid
        and a.version = b.version

سيؤدي ذلك إلى إنشاء انضمام من هذه الاسمية الفرعية وعادة ما يكون أسرع بكثير من استعلام فرعي مرتبط الذي يختار الحد الأقصى لكل منهما articleid.

SELECT Articles.id FROM Articles WHERE Articles.version IN (SELECT MAX(Articles.version) FROM Articles)

ربما شيء مثل:

حدد * من المقالات حيث articleid في (حدد Max (artableversion) من المقالات)

يمكنك ان تفعل

SELECT articles.id
  FROM articles a
 WHERE NOT EXISTS(SELECT * FROM articles a2 WHERE a2.version > a.version)

لا أعرف MySQL سيؤدي معها، لكن أوراكل و SQL Server بخير معها.

قد تحل جميع الإجابات المذكورة أعلاه مشكلة DJDonal3000 المعلنة. ولكن، فإن معظمهم يرتبطون باستفسارات الفرعية التي تعيق أداء التطبيق. إذا كنت تستخدم تطبيق سحابة إذن، أقترح عدم استخدام الاستعلامات المذكورة أعلاه. أفضل طريقة ثم هي الحفاظ على طاولتين، A و B. تحتوي دائما على أحدث إصدار من المقالة و باء وجود تفاصيل لجميع الإصدارات. هذه القضية ستكون هناك المزيد من التحديثات والإيرادات في الجداول، ولكن الجلب سيكون أسرع لأنك تحتاج فقط إلى تنفيذ استعلام محدد عادي في الجدول A. تقوم المجموعة By and Max في استعلام داخلي سيكلفك

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