需要在MySQL表中查找新的唯一ID号的数量

需要在MySQL表中查找新的唯一ID号的数量,mysql,distinct,Mysql,Distinct,我有一个iPhone应用程序,每当用户使用它时,它就会呼叫我的服务器。在我的服务器上,我每次都在MySQL表中创建一行,其唯一ID类似于设备、IP地址和其他数据的序列号(也称为UDID) 表ClientLog列: 时间、UDID等 我想知道的是给定日期新设备和新独特UDID的数量。即,在给定日期,有多少UDID被添加到表中,但在该日期之前没有出现?简单地说,这就是我那天获得的新用户数量 我想这很接近,但我不是100%在那里,也不确定这是我想要的 SELECT distinct UDID FROM

我有一个iPhone应用程序,每当用户使用它时,它就会呼叫我的服务器。在我的服务器上,我每次都在MySQL表中创建一行,其唯一ID类似于设备、IP地址和其他数据的序列号(也称为UDID)

表ClientLog列: 时间、UDID等

我想知道的是给定日期新设备和新独特UDID的数量。即,在给定日期,有多少UDID被添加到表中,但在该日期之前没有出现?简单地说,这就是我那天获得的新用户数量

我想这很接近,但我不是100%在那里,也不确定这是我想要的

SELECT distinct UDID
FROM ClientLog a
WHERE NOT EXISTS (
    SELECT * 
    FROM ClientLog b 
    WHERE a.UDID = b.UDID AND b.Time <= '2010-04-05 00:00:00'
)

我认为返回的行数是给定日期后新的唯一用户数,但我不确定。我想添加到语句中,将其限制在一个日期范围内,并指定一个上限。

您的查询似乎正确,您可以这样添加边界:

SELECT DISTINCT UDID FROM ClientLog a WHERE a.Time >= '2010-04-05 00:00:00'
                                        AND a.Time <  '2010-04-06 00:00:00'

AND NOT EXISTS(SELECT * FROM ClientLog b WHERE a.UDID = b.UDID
                                           AND b.Time < '2010-04-05 00:00:00');
更新:我想到的另一种方法如下,但我相信它速度较慢:

SELECT DISTINCT UDID FROM ClientLog a WHERE a.Time >= '2010-04-05 00:00:00'
                                        AND a.Time <  '2010-04-06 00:00:00'
                                        AND a.UDID <> ALL
(SELECT DISTINCT udid FROM ClientLog b where b.Time < '2010-04-05 00:00:00');
更新2:当然,如果您只对新UDID的数量感兴趣,那么这将是最好的解决方案:

SELECT COUNT(DISTINCT UDID) FROM ClientLog WHERE Time < '2010-04-05 00:00:00';
SELECT COUNT(DISTINCT UDID) FROM ClientLog WHERE Time < '2010-04-06 00:00:00';

然后看看你的代码有什么不同,在MySQL中可能有办法做到这一点,但我不是MySQL专家。

你的查询似乎是正确的,你可以像这样添加边界:

SELECT DISTINCT UDID FROM ClientLog a WHERE a.Time >= '2010-04-05 00:00:00'
                                        AND a.Time <  '2010-04-06 00:00:00'

AND NOT EXISTS(SELECT * FROM ClientLog b WHERE a.UDID = b.UDID
                                           AND b.Time < '2010-04-05 00:00:00');
更新:我想到的另一种方法如下,但我相信它速度较慢:

SELECT DISTINCT UDID FROM ClientLog a WHERE a.Time >= '2010-04-05 00:00:00'
                                        AND a.Time <  '2010-04-06 00:00:00'
                                        AND a.UDID <> ALL
(SELECT DISTINCT udid FROM ClientLog b where b.Time < '2010-04-05 00:00:00');
更新2:当然,如果您只对新UDID的数量感兴趣,那么这将是最好的解决方案:

SELECT COUNT(DISTINCT UDID) FROM ClientLog WHERE Time < '2010-04-05 00:00:00';
SELECT COUNT(DISTINCT UDID) FROM ClientLog WHERE Time < '2010-04-06 00:00:00';

那么看看你的代码有什么不同,在MySQL中可能有办法做到这一点,但我不是MySQL专家。

我不确定是什么意思?只是想知道为什么你不能交叉核对你的结果。你说我不确定是什么意思?只是想知道为什么你不能交叉检查你的结果。好的,第一个解决了。我通过对每个日期运行查询进行验证,然后对结果进行合计,合计结果等于表中所有唯一UDID的数量。谢谢更新2让我觉得自己很笨。很明显,但我没看到。再次感谢不客气如果你对我的答案感到满意,请不要忘记将其标记为已接受。哦,现在一切就绪。再次感谢。好的,第一个解决了。我通过对每个日期运行查询进行验证,然后对结果进行合计,合计结果等于表中所有唯一UDID的数量。谢谢更新2让我觉得自己很笨。很明显,但我没看到。再次感谢不客气如果你对我的答案感到满意,请不要忘记将其标记为已接受。哦,现在一切就绪。再次感谢。