سؤال سؤال SQL: X والعديد من Y. الحصول كل X والحصول على فقط أحدث Y في X
سؤال
ونفترض أن لدينا جدولين. آخر وتعليق. آخر لديه العديد من تعليقات. التظاهر تمتلئ أنها إلى حد ما بحيث يتم اختلف عدد من التعليقات لكل وظيفة. أريد استعلام التي سوف انتزاع كل المشاركات ولكن فقط في أحدث تعليق لكل وظيفة.
ولقد وجهت لينضم والاستفسارات الفرعية ولكن لا استطيع ان الرقم بها.
ناتج المثال:
وPost1: Comment4 (أحدث لpost1)
وPost2: Comment2 (أحدث لpost2)
وPost3: التعليق 10 (الأحدث لpost3)
وغيرها ...
وأي مساعدة سيكون موضع تقدير كبير. شكرا.
المحلول
وهذه الإجابة تفترض أن لديك معرف فريد لكل تعليق، وأنه من عدد متزايد. وهذا هو، في وقت لاحق المشاركات ديها أعداد أعلى من المشاركات السابقة. ليس من الضروري أن تكون متتابعة، فقط يجب أن تكون المقابلة على النظام من المدخلات.
أولا، هل استعلام الذي يستخرج تعليق أقصى الهوية، والتي تم تجميعها حسب رقم المشاركة.
وشيء من هذا القبيل:
SELECT MAX(ID) MaxCommentID, PostID
FROM Comments
GROUP BY PostID
وهذا سوف أعطيك قائمة رقم المشاركة ل، وأعلى (أحدث) تعليق معرف لكل واحد.
وبعد ذلك يمكنك الانضمام مع هذا، لاستخراج باقي البيانات من التعليقات، بالنسبة لأولئك في الهوية.
SELECT C1.*, C2.PostID
FROM Comments AS C1
INNER JOIN (
SELECT MAX(ID) MaxCommentID, PostID
FROM Comments
GROUP BY PostID
) AS C2 ON C1.CommentID = C2.MaxCommentID
وبعد ذلك، يمكنك الانضمام مع المشاركات، للحصول على المعلومات حول تلك الوظائف.
SELECT C1.*, P.*
FROM Comments AS C1
INNER JOIN (
SELECT MAX(ID) MaxCommentID, PostID
FROM Comments
GROUP BY PostID
) AS C2 ON C1.CommentID = C2.MaxCommentID
INNER JOIN Posts AS P ON C2.PostID = P.ID
وثمة نهج بديل لا يستخدم معرف المشاركة الاستعلام الداخلي على الإطلاق. أولا، اقتطاف تعليق أقصى معرف لجميع الوظائف فريدة من نوعها، ولكن لا يهتمون التي المنصب، ونحن نعلم انهم فريدة من نوعها.
SELECT MAX(ID) AS MaxCommentID
FROM Comments
GROUP BY PostID
وثم القيام شرط IN، للحصول على باقي البيانات لتلك التعليقات:
SELECT C1.*
FROM Comments
WHERE C1.ID IN (
SELECT MAX(ID) AS MaxCommentID
FROM Comments
GROUP BY PostID
)
وبعد ذلك ببساطة الانضمام في المشاركات:
SELECT C1.*, P.*
FROM Comments AS C1
INNER JOIN Posts AS P ON C1.PostID = P.ID
WHERE C1.ID IN (
SELECT MAX(ID) AS MaxCommentID
FROM Comments
GROUP BY PostID
)
نصائح أخرى
وحدد أحدث تعليق من فرعي
ومنها مثلا
Select *
from Posts po
Inner Join
(
Select CommentThread, CommentDate, CommentBody, Post from comments a
inner join
(select commentthread, max(commentdate)
from comments b
group by commentthread)
on a.commentthread = b.commentthread
and a.commentdate = b.commentdate
) co
on po.Post = co.post
select *
from post
, comments
where post.post_id = comments.post_id
and comments.comments_id = (select max(z.comments_id) from comments z where z.post_id = post.post_id)
وإذا كنت لا يزال ينبغي أن يكون عالقا مع إصدار الخلية القديم، الذي لا يعرف الاستعلامات الفرعية يمكنك استخدام شيء من هذا القبيل
SELECT p.id, c1.id FROM posts as p LEFT JOIN comments as c1 ON p.id = c1.postId LEFT JOIN comments as c2 ON c1.postId = c2.postId AND c1.id < c2.id WHERE isnull(c2.id) ORDER BY p.idEither الطريقة، تحقق الاستعلام الخاص بك مع <لأ href = "HTTP: //dev.mysql كوم / وثيقة / RefMan معلومات / 5.0 / EN / باستخدام-explain.html "يختلط =" نوفولو noreferrer "> شرح للحصول على مشاكل الأداء.