2013-05-26 26 views
10

Tôi nhận được hai bảng, cuộc trò chuyện và tin nhắn, Điều tôi muốn làm là kết nối nội bộ từ các cuộc trò chuyện với tin nhắn.Nhận các id cao nhất theo tham gia bên trong và id tối đa

Đây là câu hỏi của tôi:

SELECT 
    messages.msg, 
    messages.`read`, 
    conversations.userid, 
    conversations.contactid 

    FROM conversations 
     INNER JOIN messages ON 
     conversations.id = messages.convId 
    WHERE conversations.id IN(443,444) 

Bây giờ mọi thứ hoạt động như mong muốn, nhưng một điều cuối cùng là trong liên kết nội nơi mà tôi sử dụng

conversations.id = messages.convId 

Tôi muốn để có được cao nhất chỉ id, như:

AND MAX(messages.id) 

Nhưng không hoạt động

EDIT: tôi đã cố gắng một lần để sử dụng:

LEFT JOIN messages 
    ON conversations.id = messages.convId 
     AND messages.id = MAX(messages.id) 

Nhưng tôi đã nhận một lỗi nói rằng: sử dụng không hợp lệ của chức năng nhóm.

+0

Bạn có thể đặt thông điệp của bạn bằng cách id: ORDER BY ASC conversations.id, messages.id DESC – Nanocom

+0

rằng sẽ cho tôi chỉ có một hàng, i 'd như một hàng trên mỗi convId – Kilise

+0

Không, nó sẽ cho nhiều hàng. Nhưng sai lầm của tôi, tôi cần phải viết ORDER BY convers.id ASC, messages.id DESC GROUP BY conversation.id – Nanocom

Trả lời

12

EDIT

này sẽ làm việc!

SELECT conversations.*, m1.* 
FROM conversations 
LEFT JOIN messages m1 
    ON conversations.id = m1.cid 
     AND m1.id = (
      SELECT MAX(m2.id) 
      FROM messages m2 
      WHERE m2.cid = conversations.id 
     ) 
+0

thực sự điều này sẽ không hoạt động, vì nó giới hạn chỉ 1 hàng, tôi muốn một hàng cho mỗi cuộc trò chuyện. id cao nhất trong messags.convId – Kilise

+1

Vì vậy, bạn chỉ muốn truy xuất tin nhắn mới nhất cho từng cuộc trò chuyện? –

+0

yes thats chính xác những gì tôi muốn – Kilise

2

Bạn đang tìm giá trị tối đa trong một nhóm. MySQL không có bất kỳ cách thực sự rõ ràng để làm điều này (rất nhiều cách với một chút thủ đoạn).

Nhưng, bạn chỉ đang tìm hai nhóm. Như vậy, bạn chỉ có thể tìm kiếm giới hạn trong mỗi nhóm và kết hợp chúng sử dụng union all:

SELECT m.msg, m.`read`, c.userid, 
     c.contactid 
FROM conversations c inner join 
    ((select m.* 
     from messages m 
     where m.convid = 443 
     order by m.id desc 
     limit 1 
    ) union all 
     (select m.* 
     from messages m 
     where m.convid = 444 
     order by m.id desc 
     limit 1 
    ) 
    ) m 
    ON c.id = m.convId; 

Nếu bạn có chỉ số về messages(convid, id)conversations(id), thì đây nên được khá nhanh.

Bạn cũng có thể làm điều này bằng cách sử dụng phương pháp tiêu chuẩn hơn:

SELECT m.msg, m.`read`, c.userid, 
     c.contactid 
FROM conversations c inner join 
    messages m 
    ON c.id = m.convId 
where c.convId in (443, 444) and 
     m.id = (select max(id) from messages m2 where m2.convId = c.convId) 
Các vấn đề liên quan