Mysql 不确定如何使SQL查询能够正常工作
我有两个名为table1和table2的表:Mysql 不确定如何使SQL查询能够正常工作,mysql,greatest-n-per-group,Mysql,Greatest N Per Group,我有两个名为table1和table2的表: 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
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
当我执行一个查询时,我希望从表1中得到一行,该行具有最大日期
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
我希望输出是
table 2 Id Date USER
12345 2018-02-13 09:41:43 a@gmail.com
因为所选的最大日期与用户不同t@gmail.com但是a@gmail.com
关于哪里出错以及如何调整它以获得正确结果的任何建议?当您使用分组函数,即max、sum、count等时。您必须在SELECT子句中仅指定分隔列。 在您的情况下,对于一个给定的id有多封电子邮件,很像date字段。 你不能只是具体说明
SELECT id, max(date), email ...
这没有意义,因为需要为邮件指定分组函数
您真正感兴趣的是与给定id的日期为maxdate的行对应的电子邮件
这必须使用子查询来完成。大概是这样的:
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
这在英语中意味着:对于表2中的每个id,带上它的状态,并带上表1中对应cid的行,其日期是表1中相同cid的最大日期
因为我使用了内部联接,所以表1中提到表2中不存在的cid的记录将被丢弃。您可以这样编写查询:在u日期添加订单描述:
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;
选择*从表1 t1连接表2 t2到表1。cId=t2.id其中date=select maxdate从表1表2 c和表1 u使用普通名称真的有那么难吗@AnkushRathi给定字段的where子句中的子查询是次优的…感谢草莓,帮助我更好地格式化它。道歉这是我的第一个问题,我会努力以更好的方式提出。还有@Michal,我知道:我想用一个例子来询问这个问题,以了解我错在哪里,在紧急情况下,我写下了我脑海中第一个想到的名字。其他人能不能对此再多解释一下?尝试了几个子查询选项,但没有一个能给我带来我想要的结果;谢谢Gabriel,我必须尝试一下,但是本例中的id是同一个表的,但是我正在从表2中查找id,所以不知道我是否正确读取了查询。@vraviz它是相同的。你仍然可以把整个事情和你的桌子结合起来。我的意思是:为了使表1中的行对应于指定id的最高日期,您需要再次使用子查询连接到表1。感谢@Gabriel,我一定会尝试此操作并进行更新。@Gabrial,所以在快速测试后,我看到这列出了所有用户,而不仅仅是max date行。相当于从表1中选择*,所以如果我将其与表2合并,这将不会有帮助。我相信结果将是相同的。其他人是否可以对此多加说明?尝试了几个子查询选项,但没有一个能给我带来我想要的结果;