سؤال سؤال SQL: X والعديد من Y. الحصول كل X والحصول على فقط أحدث Y في X

StackOverflow https://stackoverflow.com/questions/804397

  •  03-07-2019
  •  | 
  •  

سؤال

ونفترض أن لدينا جدولين. آخر وتعليق. آخر لديه العديد من تعليقات. التظاهر تمتلئ أنها إلى حد ما بحيث يتم اختلف عدد من التعليقات لكل وظيفة. أريد استعلام التي سوف انتزاع كل المشاركات ولكن فقط في أحدث تعليق لكل وظيفة.

ولقد وجهت لينضم والاستفسارات الفرعية ولكن لا استطيع ان الرقم بها.

ناتج المثال:

و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.id
Either الطريقة، تحقق الاستعلام الخاص بك مع <لأ href = "HTTP: //dev.mysql كوم / وثيقة / RefMan معلومات / 5.0 / EN / باستخدام-explain.html "يختلط =" نوفولو noreferrer "> شرح للحصول على مشاكل الأداء.

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