2011-05-19 11 views
8

OK, potrzebuję tu guru MySQL. Próbuję napisać zapytanie, które będzie służyć jako system powiadomień, gdy ktoś zostawi komentarz do przedmiotu, który wcześniej skomentowałeś. W tabeli „drinkComment” jest bardzo prosta:Podzapytanie MySQL z główną zmienną danych zapytania

commentID, userID, drinkID, datetime, comment 

Pisałem kwerendę, która będzie uzyskać wszystkie komentarze na napoje, które już wcześniej skomentował (które nie są moje), ale będzie nadal wykazują komentarzy które wystąpiły PRZED moim komentarzem. To jest tak bliskie temu, co według mnie mogłoby zadziałać, ale tak nie jest. Proszę pomóż!

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 

Odpowiedz

10

Dlaczego nie zacząć prequery użytkownika i wszystkich napojów oni oferowanych komentarze i jak z jakim czasie (nie wiem, czy masz wiele komentarzy na osobę dla danego napoju, czy nie). Następnie znajdź komentarze od wszystkich innych po Twoim komentarzu o dacie/czasie ...

To zapytanie powinno być rzeczywiście szybsze, ponieważ ROZPOCZĄŁA się z tylko komentarzami ONE USER's drink, a następnie powraca do tabeli komentarzy dla te odpowiadające identyfikatorowi napoju i czasowi odcięcia.

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

Bardzo ładne rozwiązanie! Działa i działa szybciej! Dzięki! – adamweeks

+0

@AdamWeeks, staramy się oferować skuteczne rozwiązania, pomagając innym ... Zawsze możesz zmienić "sprawdzoną" odpowiedź, aby pomóc przyszłym ludziom w znalezieniu lepszego rozwiązania niż tylko pierwsze. – DRapp

+0

+1 Świetny samouczek podkwerendy. Nie zdawałem sobie sprawy, że potrzebuję podzapytania w sekcji "OD", aby uzyskać dostęp do jego wyników w głównej kwerendzie – foochow

2

Myślę, że musisz odnieść swoje najskrytsze zapytanie do środkowego zapytania przez 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

To nie było dokładnie to, ale zmodowałem go do pracy! Dzięki wielkie! Pierwsze "OD SPEKTAKtóW" na "Z POJEMNIKóW napoju AS" zamiast środkowego. – adamweeks

+0

Niestety, edytowałem mój komentarz. – adamweeks