2014-12-21 3 views
-2

Моя таблица выглядит так:MySQL запросов, по крайней мере, один раз в х дней

Имя: Пользователь Transaction Data
Формат даты DD/MM/YYYY данные только 4 месяца (сентябрь, октябрь, ноябрь, декабрь)

Id User Date 
25 127 23/10/2014 
26 128 25/11/2014 
25 127 22/11/2014 
47 17 22/1/2014 
25 127 12/9/2014 
25 127 22/12/2014 

Если я хочу найти пользователя, чья запись присутствует не реже одного раза в 30 дней. Ответ должен быть 127. Как пользователь 127 присутствует во всех 4-х месяцев, по крайней мере, один раз
Пользователь 128 сделал только одну сделку в ноябре не сделали операцию, по крайней мере, один раз в месяц, так не выбран

Как написать запрос для этого?

+1

Что означает колонка 'Id'? Очевидно, что это не первичный ключ. –

+0

ID 25 и соответствующая запись для пользователя127 присутствует в каждом месяце –

+1

Итак, вы хотите запросить все идентификаторы пользователей, которые имеют запись для каждого месяца до сегодняшнего дня? Но с какой даты? –

ответ

0
SELECT User, COUNT(*) AS number_of_presence FROM (
    SELECT DATE_FORMAT(`Date`,'%Y-%m') AS date_month, User  
    FROM `table` 

    GROUP BY date_month, User 
) TMP 
GROUP BY User 
HAVING number_of_presence = 4 

The group by используется, чтобы избежать тот же пользователь несколько раз.

SQL Fiddle

+0

Не работает! можете ли вы объяснить, что нужно сделать на сегодняшний день? –

+0

см. Обновленный ответ .. – Riad

0

Я думаю, что вы после любых последовательных 30 дней, верно? К сожалению, вам, вероятно, придется присоединиться к таблице к себе, так как она ищет пары строк. Тогда запрос будет:

select 
    a1.User, 
    a1.Date as fromDate, 
    a2.Date as toDate, 
    datediff(a1.Date, a2.Date) as span 
from appearances a1, appearances a2 
where 
    a1.User=a2.User and 
    a2.Date>a1.Date and 
    datediff(a2.Date, a1.Date) <= 30; 

Создание структуры для записи:

CREATE TABLE appearances 
    (`Id` int, `User` int, `Date` date) 
; 

INSERT INTO appearances 
    (`Id`, `User`, `Date`) 
VALUES 
    (25, 127, '2014-10-23'), 
    (26, 128, '2014-11-25'), 
    (25, 127, '2014-11-22'), 
    (47, 17, '2014-01-22'), 
    (25, 127, '2014-09-12'), 
    (25, 127, '2014-12-22') 
; 

скрипку: http://sqlfiddle.com/#!2/1a3363/7/0

0

Если вы знаете даты вы хотите проверить для пользователя, чтобы присутствовать, вы можете выбрать все строки WHERE, указанная в вашем диапазоне. Я бы использовал ключевое слово BETWEEN. Например, если вы хотите, чтобы пользователи, которые были активны в марте месяце, вы могли бы сделать что-то вроде этого:

SELECT * 
FROM myTable 
WHERE dateColumn BETWEEN '2014-03-01' AND '2014-03-31'; 

Для этого конкретного примера, кажется, что вы хотите, чтобы пользователи, которые сделали хотя бы одну покупку в каждом за последние 4 месяца. Что вы можете сделать, это использовать начало, получая строки для каждого из последних 4-х месяцев, используя функцию DATE_SUB(), чтобы установить дату начала:

SELECT * 
FROM myTable 
WHERE date >= DATE_SUB(CURDATE(), INTERVAL 4 MONTH); 

После того, как вы есть, что вы можете добавить GROUP BY заявление в группе пользователя и месяц, чтобы получить одну строку для каждого пользователя в месяц:

SELECT * 
FROM myTable 
WHERE date >= DATE_SUB(CURDATE(), INTERVAL 4 MONTH) 
GROUP BY user, MONTH(date); 

После того, как вы есть, что вы можете вытащить из него пользователям HAVING четыре строки, потому что это означает, что они сделали покупку в каждом из четырех месяцев :

SELECT user 
FROM(
    SELECT * 
    FROM myTable 
    WHERE date >= DATE_SUB(CURDATE(), INTERVAL 4 MONTH) 
    GROUP BY user, MONTH(date)) t 
GROUP BY user 
HAVING COUNT(*) = 4; 

Вот пример SQL Fiddle.

Кроме того, вот несколько хороших дат и времени functions, чтобы вы имели в виду.

Смежные вопросы