Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.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/2/cmake/2.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
Sql 是否可以将此查询转换为使用联接而不是子查询?_Sql_Mysql_Join_Subquery - Fatal编程技术网

Sql 是否可以将此查询转换为使用联接而不是子查询?

Sql 是否可以将此查询转换为使用联接而不是子查询?,sql,mysql,join,subquery,Sql,Mysql,Join,Subquery,这个怎么样: SELECT number, count(id) FROM tracking WHERE id IN (SELECT max(id) FROM tracking WHERE splitnr = 'a11' AND number >0 AND timestamp >= '2009-04-08 00:00:00' AND timestamp <= '2009-04-08 12:55:57' GROUP BY ident) GROUP BY

这个怎么样:

SELECT
    number, count(id)
FROM
    tracking
WHERE
    id IN (SELECT max(id) FROM tracking WHERE splitnr = 'a11' AND number >0 AND timestamp >= '2009-04-08 00:00:00' AND timestamp <= '2009-04-08 12:55:57' GROUP BY ident)
GROUP BY
    number
这个怎么样:

SELECT
    number, count(id)
FROM
    tracking
WHERE
    id IN (SELECT max(id) FROM tracking WHERE splitnr = 'a11' AND number >0 AND timestamp >= '2009-04-08 00:00:00' AND timestamp <= '2009-04-08 12:55:57' GROUP BY ident)
GROUP BY
    number

在不查看数据和不确切了解您想要实现的目标的情况下,很难确保完全正确,但就我个人而言,我会将子查询转换为视图,然后加入其中,因此:

SELECT    number, count(id)
FROM    tracking 
  INNER JOIN (SELECT max(id) ID FROM tracking  
                 WHERE splitnr = 'a11' AND 
                       number >0 AND timestamp >= '2009-04-08 00:00:00' AND 
                       timestamp <= '2009-04-08 12:55:57'
              GROUP BY ident
             ) MID ON (MID.ID=tracking.id)
WHERE   
GROUP BY number

更具可读性和可维护性。

在不查看数据和不确切了解您想要实现的目标的情况下,我很难确保完全正确,但我个人会将子查询转换为视图,然后加入其中,因此:

SELECT    number, count(id)
FROM    tracking 
  INNER JOIN (SELECT max(id) ID FROM tracking  
                 WHERE splitnr = 'a11' AND 
                       number >0 AND timestamp >= '2009-04-08 00:00:00' AND 
                       timestamp <= '2009-04-08 12:55:57'
              GROUP BY ident
             ) MID ON (MID.ID=tracking.id)
WHERE   
GROUP BY number

更具可读性和可维护性。

您不能执行以下操作:

create view vMaximumIDbyIdent

as

SELECT ident, max(id) maxid

FROM tracking 

WHERE splitnr = 'a11' AND number >0 

AND timestamp >= '2009-04-08 00:00:00' 

AND timestamp <= '2009-04-08 12:55:57' 

GROUP BY ident

then:


SELECT

    number, count(id)
FROM

    tracking,

    vMaximumIDbyIdent

WHERE

    tracking.id = vMaximumIDbyIdent.maxid

GROUP BY

    number
顺便说一下,我不太了解MySQL

我假设这会给你同样的结果集,你按数字desc排序,因为你想要最大的一个,对吗?然后你可以把WHERE子句放进去,用1限制它,给你第一个,它基本上和MAX一样,我想这样就完全去掉了连接


编辑:我认为您也不需要识别组

您是否可以执行以下操作:

create view vMaximumIDbyIdent

as

SELECT ident, max(id) maxid

FROM tracking 

WHERE splitnr = 'a11' AND number >0 

AND timestamp >= '2009-04-08 00:00:00' 

AND timestamp <= '2009-04-08 12:55:57' 

GROUP BY ident

then:


SELECT

    number, count(id)
FROM

    tracking,

    vMaximumIDbyIdent

WHERE

    tracking.id = vMaximumIDbyIdent.maxid

GROUP BY

    number
顺便说一下,我不太了解MySQL

我假设这会给你同样的结果集,你按数字desc排序,因为你想要最大的一个,对吗?然后你可以把WHERE子句放进去,用1限制它,给你第一个,它基本上和MAX一样,我想这样就完全去掉了连接


编辑:我认为您也不需要GROUP BY ident

您需要将GROUP BY ident添加到内部子查询中。您确定吗?我认为没有必要。OP更改了问题,新版本下需要内部分组,所以我将其重新添加。问题不是子查询而是子查询,这肯定是原始查询的重构,但仍然使用子查询…从技术上讲,它使用的是一个驱动表而不是子查询。您需要将GROUP BY ident添加到内部子查询中。您确定吗?我不认为有必要。OP改变了问题,新版本下需要内部分组,所以我将其添加了回去。不是问题而是子查询,这肯定是原始查询的重构,但仍然使用子查询…从技术上讲,它使用一个驱动表,而不是子查询。请确认我的答案是正确的,你能用英语向问题中添加你希望查询返回的内容吗?子查询中的WHERE id只是为了确认我的答案是正确的,你能用英语向问题中添加你希望查询返回的内容吗?子查询中的WHERE id