Необходимо найти количество новых уникальных идентификационных номеров в таблице MySQL.

У меня есть приложение для iPhone, которое «звонит домой» на мой сервер каждый раз, когда пользователь его использует. На моем сервере я каждый раз создаю строку в таблице MySQL с уникальным идентификатором (похожим на серийный номер), также известным как UDID, для устройства, IP-адреса и других данных.

Столбцы таблицы ClientLog: Time, UDID, etc, etc.

Я хотел бы знать количество новых устройств (новых уникальных 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'
)

Я думаю, что количество возвращаемых строк - это новые уникальные пользователи после указанной даты, но я не уверен. И я хочу добавить к оператору, чтобы ограничить его диапазоном дат (также указать верхнюю границу).


person Nicholas    schedule 05.04.2010    source источник
comment
Что вы имеете в виду под я не уверен? Просто интересно, почему вы не можете перепроверить свои результаты.   -  person John    schedule 06.04.2010


Ответы (1)


Ваш запрос кажется правильным, и вы можете добавить такие границы:

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).

person Can Berk Güder    schedule 05.04.2010
comment
Хорошо, первый решил это. Я проверил, выполнив запрос для каждой даты, затем суммировав результаты, и общее количество равняется общему количеству уникальных UDID в таблице. Спасибо! Обновление 2 заставляет меня чувствовать себя довольно глупо. Так очевидно, но я не видел этого. Спасибо еще раз. :) - person Nicholas; 06.04.2010
comment
Пожалуйста. =) Если вас устраивает мой ответ, не забудьте отметить его как принятый. - person Can Berk Güder; 06.04.2010
comment
Упс, теперь все готово. Спасибо еще раз. - person Nicholas; 06.04.2010