Регистрация пользователя MySQL подсчитывает между группами - PullRequest
0 голосов
/ 29 марта 2011

Допустим, у меня есть таблица 'wp_users' со следующими данными:

Name            user_registered        ID
dog            2008-05-14 18:53:30     1
cat            2008-05-14 12:13:20     2
mouse          2008-05-14 08:51:32     3
giraffe        2008-05-15 22:13:31     4
Moose          2008-05-16 13:20:30     5
monkey         2008-05-16 08:51:32     6
mongoose       2008-05-16 22:13:31     7
fish           2008-05-16 13:00:30     8

У меня есть еще одна таблица 'wp_usermeta', где wp_users.ID == wp_usermeta.user_id:

user_id   meta_key               meta_value
1         wp_capabilities            a:1:{s:10:"subscriber";s:1:"1";}
2         wp_capabilities         a:1:{s:15:"s2member_level2";s:1:"1";}
2         wp_s2member_subscr_id    I-SDJKSDD
3         wp_capabilities          a:1:{s:15:"s2member_level2";s:1:"1";}
3         wp_s2member_subscr_id    I-sdfsdfsdf
4         wp_cabilities            a:1:{s:10:"subscriber";s:1:"1";}
5         wp_cabilities            a:1:{s:10:"subscriber";s:1:"1";}
6         wp_cabilities            a:1:{s:10:"subscriber";s:1:"1";}
7         wp_capabilities          a:1:{s:15:"s2member_level2";s:1:"1";}
7         wp_s2member_subscr_id    I-sd45gds
8         wp_capabilities          a:1:{s:15:"s2member_level2";s:1:"1";}
8         wp_s2member_subscr_id    I-3fskkhh

То, что я ищу, - это способ генерации некоторых сводных столбцов, которые подсчитывают количество регистраций подписчиков и регистраций s2member_level2 для каждого дня wp_users.user_registered даты (меня не интересует час дня, просто дата ). Чтобы определить их немного лучше:

"subscriber": НЕ будет строки, в которой meta_key = wp_s2member_subscr_id - она ​​просто не существует. Обратите внимание, что пользователи 1,4,5 и 6 не имеют этой строки, поэтому они являются «подписчиками». Также в строке «wp_capabilities» вместо «s2member_level2» будет указано слово «subscriber». Оба критерия НЕ ДОЛЖНЫ выполняться, потому что они верны для всех подписчиков (я упоминаю оба в случае, если один легче проверить, чем другой).

"s2member_level2": есть строка, где meta_key = wp_s2member_subscr_id с некоторыми случайными буквенными значениями (пользователи 2,3,7,8 в таблицах выше). Он также будет иметь слово "s2member_level2" в значении для meta_value. Оба критерия НЕ ДОЛЖНЫ выполняться, потому что оба они верны для всех s2member_level2 (я упоминаю оба в случае, если один легче проверить, чем другой).

Идеальный результат будет выглядеть следующим образом для приведенных выше таблиц:

Date              subscriber     s2member_level2
2008-05-14         1              2
2008-05-15         1              0
2008-05-16         2              2

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

Ответы [ 3 ]

1 голос
/ 29 марта 2011
select date, SUM(case when subscriber = 1 and s2member_level2 = 0 then 1 else 0 end) subscriber,
           SUM(case when s2member_level2 = 1 then 1 else 0 end) s2member_level2
from
(   select  date(user_registered) date,
             id,
            sum(case when B.meta_key = "wp_capabilities" then 1 else 0 end) as subscriber,
            sum(case when B.meta_key = "wp_s2member_subscr_id" then 1 else 0 end) as s2member_level2
    from wp_users A LEFT JOIN wp_usermeta B ON A.Id = B.user_id            
    group by date(user_registered), id
) C
group by date
1 голос
/ 29 марта 2011

Вот работоспособное решение, использующее временную таблицу.

Прежде всего, получите строку для каждого пользователя и объедините все его «мета-ключи», а также отбросив часть времени из отметки даты и времени:

CREATE TEMPORARY TABLE user_keys
SELECT wp_users.ID, 
       DATE_FORMAT(user_registered,'%Y-%m-%d') AS user_registered
       GROUP_CONCAT(meta_key) AS meta_keys
FROM wp_users
LEFT JOIN wp_usermeta AS subs ON (wp_users.ID = subs.user_id)
GROUP BY wp_users.ID
ORDER BY wp_users.ID

Затем ВЫБЕРИТЕ на своей временной таблице, чтобы проверить, какие ключи есть у каждого пользователя, и подсчитать их:подселектов и еще много чего, но это работает с данными вашего примера ...

0 голосов
/ 29 марта 2011

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

подсчет / подсчет результатов mysql за день

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...