不确定如何使这个工作尊重SQL查询

时间:2018-02-13 14:52:45

标签: mysql greatest-n-per-group

我有两个名为table1和table2的表:

var array = [{"x" : 3}, {"x" : 4}, {"x": 5}, {"x" : 3}];
var counter = 1;
    
var newArray = array.map(object => {
    
   var calculatedY = counter;
   counter++;
   //just an example, you have to calculate your y based on your conditions
    
   return { x : object.x, y : calculatedY }
})
    
console.log(newArray);

当我执行查询时,我希望从table1获得具有最大日期的行。

Table1
 id           date               email            cId
  1    2013-08-28 12:21:39     t@gmail.com       12345
  2    2013-07-27 10:15:18     k@gmail.com       12345
  3    2018-02-13 09:41:43     a@gmail.com       12345
  4    2018-02-02 10:14:42     n@gmail.com       45678
  5    2017-11-16 10:16:51     l@gmail.com       45678

Table2
 id           status
12345           1     
45678           1
56789           0

我所看到的有点令人困惑。

select c.id 'table 2 Id'
     , DATE_FORMAT(Max(u.date),'%Y-%m-%dT%TZ') 'Date'
     , u.email 'User' 
  from table2 c
  LEFT 
  JOIN table1 u 
    ON u.cId = c.id 
 where c.status = 1 
 group 
    by c.id 
 order 
    by c.id;

我期待输出

 table 2 Id           Date               USER       
  12345        2018-02-13 09:41:43     t@gmail.com

因为所选的最大日期与用户t@gmail.com不同,但与a@gmail.com相同

有关哪里出错的任何建议,我如何调整以获得正确的结果?

2 个答案:

答案 0 :(得分:1)

当您使用分组功能(即最大值,总和,计数等)时,您必须仅在SELECT子句中指定隔离列。 在您的情况下,有一个给定ID的电子邮件,很像日期字段。 你不能只指定

SELECT id, max(date), email ...

它没有意义,因为您需要为邮件指定分组功能。

您真正感兴趣的是"对应于给定ID"的日期为最大(日期)的行的电子邮件。

这必须使用子查询来完成。像这样:

SELECT
  tmax.cid,
  tmax.maxdate,
  table1.email,
  table2.status
FROM
  table2
  INNER JOIN table1
    ON table1.cid = table2.id

  INNER JOIN (

               SELECT
                 cid,
                 max(date) AS maxdate
               FROM
                 table1
               GROUP BY
                 cid
             ) AS tmax

    ON tmax.cid = table1.cid AND tmax.maxdate = table1.date;

对您的数据集执行的上述查询将给出这个确切的输出(2行):

cid   maxdate             email       status
12345 2018-02-13 09:41:43 a@gmail.com 1
45678 2018-02-02 10:14:42 n@gmail.com 1

表示英文:"对于table2中的每个id,请显示其状态,并将table1中的行带入相应的cid,其日期是table1中相同cid的最大日期。&#34 ;

因为我使用了INNER JOIN s,所以table1中提及table2中不存在的cid的记录将被丢弃。

答案 1 :(得分:-1)

您可以像这样编写查询(在u.date上添加订单desc):

SELECT c.id 'table 2 Id', DATE_FORMAT(MAX(u.date),'%Y-%m-%dT%TZ') 'Date', u.email 'User'
FROM table2 c
LEFT JOIN table1 u ON u.cId = c.id
WHERE c.status = 1 
GROUP BY c.id 
ORDER BY c.id, u.date DESC;