2011-05-19 45 views
8

Ok, cần một chuyên gia MySQL tại đây. Tôi đang cố gắng để viết một truy vấn sẽ phục vụ như một hệ thống thông báo cho khi ai đó để lại một bình luận về một mục mà bạn đã nhận xét trước đó. Bàn 'bình chọn đồ uống' rất đơn giản:Truy vấn con MySQL với biến dữ liệu truy vấn chính

commentID, userID, drinkID, datetime, comment 

Tôi đã viết một truy vấn nhận xét về đồ uống mà trước đó tôi đã nhận xét (không phải của tôi), nhưng vẫn sẽ hiển thị nhận xét đã xảy ra TRƯỚC KHI bình luận của tôi. Điều này là gần với những gì tôi nghĩ rằng sẽ làm việc, nhưng nó không. Hãy giúp tôi!

select @drinkID:=drinkComments.drinkID, commentID, drinkID, userID, comment, datetime 
FROM drinkComments 
WHERE `drinkID` IN 
    (select distinct drinkID from drinkComments where drinkComments.userID = 1) 
AND drinkComments.dateTime > (
/*This gets the last date user commented on the main query's drinkID*/ 
select datetime FROM drinkComments WHERE drinkComments.userID = 1 AND drinkComments.drinkID = @drinkID ORDER BY datetime DESC LIMIT 1 
) 
ORDER BY datetime DESC 

Trả lời

10

Tại sao không bắt đầu với một prequery của người sử dụng và tất cả các loại đồ uống mà họ đã đưa ra ý kiến ​​và như những gì thời gian (không biết nếu bạn có nhiều ý kiến ​​mỗi người đối với bất kỳ thức uống được hay không). Sau đó, tìm nhận xét từ tất cả những người khác SAU như bình luận về ngày/giờ của bạn ...

Truy vấn này thực sự sẽ nhanh hơn khi BẮT ĐẦU chỉ với một bình luận uống của NGƯỜI DÙNG, THEN quay lại bảng nhận xét những người phù hợp với ID uống và thời gian cắt.

SELECT STRAIGHT_JOIN 
     dc.* 
    from 
     (select 
       drinkID, 
       max(datetime) UserID_DrinkCommentTime 
      FROM 
       drinkComments 
      WHERE 
       userID = 1 
      group by 
       drinkID) PreQuery 
     join DrinkComments dc 
     on PreQuery.DrinkID = dc.DrinkID 
     and dc.datetime > PreQuery.UserID_DrinkCommentTime 
    order by 
     dc.DateTime desc 
+0

Giải pháp rất hay! Hoạt động và hoạt động nhanh hơn! Cảm ơn! – adamweeks

+0

@AdamWeeks, chúng tôi cố gắng cung cấp các giải pháp hiệu quả khi trợ giúp người khác ... Bạn luôn có thể thay đổi câu trả lời "đã chọn" để giúp những người tương lai có được giải pháp tốt hơn chỉ là giải pháp đầu tiên. – DRapp

+0

+1 Hướng dẫn truy vấn phụ tuyệt vời. Không nhận ra tôi cần truy vấn phụ trong phần 'FROM' để truy cập kết quả của nó trong truy vấn chính – foochow

2

Tôi nghĩ bạn cần phải liên kết truy vấn trong cùng với truy vấn trung gian của drinkID.

select @drinkID:=drinkComments.drinkID, commentID, drinkID, userID, comment, datetime 
FROM drinkComments 
WHERE `drinkID` IN 
    (select distinct drinkID from drinkComments AS a where drinkComments.userID = 1) 
AND drinkComments.dateTime > (
/*This gets the last date user commented on the main query's drinkID*/ 
select datetime FROM drinkComments WHERE drinkComments.userID = 1 AND drinkComments.drinkID = a.drinkID ORDER BY datetime DESC LIMIT 1 
) 
ORDER BY datetime DESC 
+0

Điều đó không chính xác, nhưng tôi đã sửa đổi nó để hoạt động! Cám ơn rất nhiều! Thực hiện "FROM drinkComments" đầu tiên thành "FROM drinkComments AS a" thay vì phần giữa. – adamweeks

+0

Rất tiếc, đã chỉnh sửa nhận xét của tôi. – adamweeks

Các vấn đề liên quan