我有两个名为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相同
有关哪里出错的任何建议,我如何调整以获得正确的结果?
答案 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;