البحث عن صف بحد أقصى قيمة المعرف في MySQL
-
19-09-2019 - |
سؤال
إلقاء نظرة على جدول 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 في استعلام داخلي سيكلفك