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