2012-10-06 91 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