Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 不确定如何使SQL查询能够正常工作_Mysql_Greatest N Per Group - Fatal编程技术网

Mysql 不确定如何使SQL查询能够正常工作

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和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
  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合并,这将不会有帮助。我相信结果将是相同的。其他人是否可以对此多加说明?尝试了几个子查询选项,但没有一个能给我带来我想要的结果;