2017-04-18 32 views
0

我有產生Mysql的加入和通過多列的過濾器值

id client_id category 
3605 608  0 
3606 608  1 
3607 608  2 
3608 608  3 
3611 609  0 
3612 609  1 
3613 609  2 
3614 609  3 
3615 609  5 
3616 609  6 
3617 610  0 
3618 610  1 
3619 610  2 
3620 610  3 
3621 610  5 
3622 610  6 

以下查詢

select events.* from clients 
inner join events on events.client_id = clients.id 
inner join salons on clients.business_id = businesses.id 
where businesses.campaign_id = 27 

我需要選擇具有類別0,1,2或事件的所有客戶端3但不與類別4,5或6.

我在想,也許有一種方法來組合事件行而不會失去對所有類別數據的訪問權限。

因此,與上述數據所期望的結果將是:

id client_id category 
3605 608  0 
3606 608  1 
3607 608  2 
3608 608  3 

最終我只在有一些事件,但沒有其他人,以便與609和610的client_id結果將因爲被忽略的客戶有興趣包括的0,1,2或3,而不是4個,5,或6

+0

請添加所需的結果。 –

+0

你的問題不太清楚,你能解釋一下你想要的輸出是什麼嗎? –

+0

@KJF,因爲你看到你已經收到了不同問題的答案;不要讓我們猜你需要什麼! –

回答

-1
select clients.id from clients 
inner join events on events.client_id = clients.id 
inner join salons on clients.business_id = businesses.id 
where businesses.campaign_id = 27 
group by clients.id 
having SUM(CASE WHEN category in (0,1,2,3) THEN 1 ELSE 0 END) = 4; 
+1

哪個要求符合'having'從句?那麼「不丟失所有類別數據的訪問權限」部分呢? –

1

從你的樣本數據的類別,我假定類別可以取的值0..6之間。鑑於此,您可以通過client_id進行分組,只接受那些max(category) <= 3;這確保在4..6之間沒有類別,並且在1..3之間至少有一個類別。

select events.client_id from clients 
inner join events on events.client_id = clients.id 
inner join salons on clients.business_id = businesses.id 
where businesses.campaign_id = 27 
group by client_id 
having max(category)<=3 

如果您還想要「保留事件數據」,您可以使用上面的查詢作爲子查詢:

select events.* from clients 
inner join events on events.client_id = clients.id 
inner join salons on clients.business_id = businesses.id 
where businesses.campaign_id = 27 
     and events.clients.id in (
    select events.client_id from clients 
    inner join events on events.client_id = clients.id 
    inner join salons on clients.business_id = businesses.id 
    where businesses.campaign_id = 27 
    group by client_id 
    having max(category)<=3 
) 
0
select events.* from clients 
inner join events on events.client_id = clients.id 
inner join salons on clients.business_id = businesses.id 
where businesses.campaign_id = 27 
and events.categoryid in (0,1,2,3) 
and not exists 
(select * from events x 
where x.client_id = clients.id and events.categoryid in (4,5,6) 
)