2012-10-06 90 views
1

如果沒有人對它們進行超過4周的評論,我必須設置一個查詢來檢索最後對客戶發表的評論。我可以使用下面的查詢使其工作,但由於某種原因,評論欄不會顯示最新的記錄。相反,它顯示的是最早的,但日期顯示的是最新的。這可能是因爲我是SQL的noob,但是我在這裏做錯了什麼?MySQL查詢無法正確顯示

SELECT DISTINCT 
    customerid, id, customername, user, MAX(date) AS 'maxdate', comment 
FROM comments 
WHERE customerid IN 
    (SELECT DISTINCT id FROM customers WHERE pastdue='1' AND hubarea='1') 
AND customerid NOT IN 
    (SELECT DISTINCT customerid FROM comments WHERE DATEDIFF(NOW(), date) <= 27) 
GROUP BY customerid 
ORDER BY maxdate 

第一個「WHERE」條款只是確保它僅顯示用戶從一個特定的區域,並認爲自己是「啓用過期」。第二個確保客戶在過去的27天內沒有被評論過。它由customerid分組,因爲那是與每個單獨客戶相關的數字。當我得到結果時,除了評論欄之外,一切都是正確的......任何想法?

回答

0

我想這大概可以做你想要達到的目的。如果你可以執行它,也許可以回報,如果有的話,我可以調整它,如果需要的話。從邏輯上講,這「應該」的工作 - 如果我已經明白烏爾問題正確:)

SELECT X.customerid, X.maxdate, co.id, c.customername, co.user, co.comment 
FROM 
    (SELECT customerid, MAX(date) AS 'maxdate' 
    FROM comments cm 
    INNER JOIN customers cu ON cu.id = cm.customerid 
    WHERE cu.pastdue='1' 
    AND cu.hubarea='1' 
    AND DATEDIFF(NOW(), cm.date) <= 27) 
    GROUP BY customerid) X 
INNER JOIN comments co ON X.customerid = co.customerid and X.maxdate = co.date 
INNER JOIN customer c ON X.customerid = c.id 
ORDER BY X.maxdate 
+0

我不得不稍微調整一下,但這就是它!非常感謝你的幫助。 –

0

您需要爲每個案例進行子查詢。

SELECT a.* 
FROM comments a 
     INNER JOIN 
     (
      SELECT customerID, max(`date`) maxDate 
      FROM comments 
      GROUP BY customerID 
     ) b ON a.customerID = b.customerID AND 
       a.`date` = b.maxDate 
     INNER JOIN 
     (
      SELECT DISTINCT ID 
      FROM customers 
      WHERE pastdue = 1 AND hubarea = 1 
     ) c ON c.ID = a.customerID 
     LEFT JOIN 
     (
      SELECT DISTINCT customerid 
      FROM comments 
      WHERE DATEDIFF(NOW(), date) <= 27 
     ) d ON a.customerID = d.customerID 
WHERE d.customerID IS NULL 
  • 第一個加入得到每個客戶的最新記錄。
  • 第二次加入僅顯示來自特定區域的客戶,並且他們「已過期」已啓用。
  • 第三次加入,使用LEFT JOIN,選擇所有在過去27天內未評論過的客戶。在這種情況下,由於條件d.customerID IS NULL,只有沒有列表的記錄被選中。

但tomake查詢更短,如果customers表早已unique記錄的客戶,那麼你就需要有子查詢的it.Directly加入表,把條件對WHERE條款。

SELECT a.* 
FROM comments a 
     INNER JOIN 
     (
      SELECT customerID, max(`date`) maxDate 
      FROM comments 
      GROUP BY customerID 
     ) b ON a.customerID = b.customerID AND 
       a.`date` = b.maxDate 
     INNER JOIN customers c 
      ON c.ID = a.customerID 
     LEFT JOIN 
     (
      SELECT DISTINCT customerid 
      FROM comments 
      WHERE DATEDIFF(NOW(), date) <= 27 
     ) d ON a.customerID = d.customerID 
WHERE d.customerID IS NULL AND 
     c.pastdue = 1 AND 
     c.hubarea = 1 
0

試試這個

select customerid, id, customername, user,date, comment from(
    select customerid, id, customername, user,date, comment, 
     @rank := IF(@current_customer = id, @rank+ 1, 1), 
     @current_customer := id 
    from comments 
    where customerid IN 
     (SELECT DISTINCT id FROM customers WHERE pastdue='1' AND hubarea='1') 
     AND customerid NOT IN 
     (SELECT DISTINCT customerid FROM comments WHERE DATEDIFF(NOW(), date) <= 27) 
    order by customerid, maxdate desc 
) where rank <= 1 
0

你的表列中的兩個不包含在聚合函數或GROUP BY子句。例如,假設您有兩個具有相同客戶ID和相同日期但具有不同註釋數據的數據行。 SQL如何聚合這兩行? :(它會產生一個錯誤......

1

加入好得多嵌套查詢,所以你可以使用join代替嵌套查詢 加入提高速度 此查詢解決您的問題。

SELECT DISTINCT customerid,id, customername, user, MAX(date) AS 'maxdate', comment FROM comments inner join customers on comments.customerid = customers.id WHERE comments.pastdue='1' AND comments.hubarea='1' AND DATEDIFF(NOW(), comments.date) <= 27 GROUP BY customerid ORDER BY maxdate