2016-05-09 2 views
1

У меня есть таблица с несколькими строками для каждого клиента и и visit_date. Дата посещения также может быть нулевой.Как выбрать строки из таблицы MySQL с максимальными значениями

Мои таблицы, как показано ниже:

клиенты:

id | name  | email 
1 | John Doe1 | [email protected] 
2 | John Doe2 | [email protected] 
3 | John Doe3 | [email protected] 

store_customers

id | customer_id | store_id | email_optedin | visit_date 
1 |  1   | 1  | 1   | 2015-11-30 
2 |  1   | 2  | 1   | 2016-05-08 
3 |  1   | 3  | 1   | null 
4 |  2   | 1  | 1   | 2015-04-30 
5 |  2   | 2  | 1   | 2015-08-40 
6 |  2   | 3  | 1   | 2015-12-12 
7 |  3   | 1  | 1   | null 
8 |  3   | 2  | 1   | null 
9 |  3   | 3  | 1   | null 

Я пытаюсь получить клиентов, которые либо не имели визит в любой из трех магазины или не посетили с указанной даты (например, 2016-04-15).

Я ожидаю клиентов 2 и 3, но не 1.

Я попробовал этот запрос:

select distinct * from customers 
inner join store_customers on store_customers.customer_id = customers.id 
    where customers.email != '' and 
    store_customer.store_id in (1,2,3) and customers.emailStatus not in ('Unverified','Bounced','Spammed') 
    and 
    (
     store_customer.email_optedin = 1 
     and max(store_customers.visit_date) <= '2016-04-15' 
     or account_customer.visit_date is null 
    ); 

Это не работает. Мне как-то нужно, для набора идентификаторов магазина), мне нужно выбрать клиентов, которые либо не посещали (все значения null для даты посещения для указанных магазинов), либо если имеется одна или несколько дат посещения, сравните макс. дата до указанной даты.

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

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

Я очень ценю любую помощь, которая может быть предоставлена.

С уважением,

Waqar

+0

Я забыл упомянуть, что я ожидал бы запрос, чтобы вернуть клиентов 2 и 3. –

+0

"или account_customer.visit_date равна нулю" : эта таблица не входит в состав JOIN ... – Webomatik

+0

извините. account_customer - опечатка. Это должны быть store_customers. Из таблицы store_customer я ожидаю строку 6 (для customer_id 2) и одну из строк 7,8,9, потому что эти три строки имеют одинаковую идентификацию customer_id (3). –

ответ

0

Попробуйте этот запрос,

SELECT 

     customers.id, 
     customers.name, 
     MAX(store_customers.visit_date) 

    FROM 

    customers LEFT JOIN store_customers on customers.id = store_customers.customer_id 

    GROUP BY customers.id,customers.name 

    HAVING MAX(store_customers.visit_date) < '2016-04-15' OR MAX(store_customers.visit_date) IS NULL 
Смежные вопросы