2014-01-18 3 views
2

У меня есть две таблицы «клиентов» и «Кампании»:MySQL условие соединяемых данных

customers 
    ------------- 
    id | int 
    ------------- 
    name | varchar 


    campaigns 
    ---------------------- 
    id   | int 
    ---------------------- 
    customers_id | int 
    ---------------------- 
    name   | varchar 

Клиент может иметь несколько кампаний. Связь между двумя таблицами осуществляется через campaigns.customers_id = customers.id. Теперь я хочу, чтобы все клиенты, которые получили кампанию с именем «A» и назвали «B».

Я попробовал JOIN с IN заявление, но он возвращает все клиенты, которые получили какой-либо кампании "A" или "B":

SELECT 
     customers.name 
    FROM 
     customers 
    JOIN 
     campaigns 
    ON 
     customers.id=campaigns.customers_id 
    WHERE 
     campaigns.name IN('A','B') 

Спасибо большое!

+1

Вы присоединились на неправильных столбцах. Также ... Группа ... с счетчиком (*) = n - где n - нет. элементов в IN() (предполагается, что (клиент, кампания) UNIQUE – Strawberry

+0

Strawberry: Спасибо, что указали имена столбцов. Вы правы, отредактировал мой вопрос. – softcr

ответ

0

Вы должны присоединиться к каждой кампании

SELECT 
    customers.name 
FROM 
    customers 
INNER JOIN campaigns c1 ON customers.id=c1.id and c1.name = 'A' 
INNER JOIN campaigns c2 ON customers.id=c2.id and c2.name = 'B' 

Это теперь будет содержать клиентов, которые получили оба.

+0

Да, хорошее обновление, но вместо того, чтобы просто писать запросы, это лучше помогает людям узнать, что и почему вы что-то сделали. Может быть, объяснение того, почему нужно удвоить соединение, и почему ваш исходный ответ был некорректным с помощью левого соединения. Люди, которые являются только ответами GIVEN, не учатся и не становятся копировальными машинами (просто конструктивная критика. .. Я тоже начал рано с более простых ответов). – DRapp

+0

Это именно то, что мне нужно, спасибо! – softcr

+0

Это решение не очень масштабируемо. – Strawberry

0
SELECT 
    customers.name 
FROM 
    customers 
LEFT JOIN campaigns c1 ON customers.id=c1.customers_id and c1.name = 'A' 
LEFT JOIN campaigns c2 ON customers.id=c2.customers_id and c2.name = 'B' 

С первым LEFT JOIN вы получите клиент, которые имеют кампании и название кампании являются «А», а затем результат будет присоединиться к кампаниям, чьи имеет название «B».

Будут выбраны только строки с campaign.name = A и campaign.name = B.

+0

Я не знаю, почему этот ответ был опущен. Может кто-нибудь объяснить мне? – carexcer

+0

Спасибо за ваш ответ! Не знаю о downvotes. Когда я меняю «LEFT JOIN» на «INNER JOIN», он возвращает ожидаемые результаты. – softcr

1

Вы присоединились к таблице кампаний с customers.id=campaigns.id вместо customers.id=campaigns.customers_id.

Правильный запрос является

SELECT 
     customers.name 
    FROM 
     customers 
    JOIN 
     campaigns 
    ON 
     customers.id=campaigns.customers_id 
    WHERE 
     campaigns.name IN('A','B') 

Это должно работать :)

+0

Извините, это была опечатка в моем вопросе. Я присоединился к правильным столбцам, используя IN, дает мне всех клиентов, у которых есть кампания «A» или «B», но я хочу, чтобы все клиенты имели обе кампании. – softcr

+0

ВЫБОР customers.name ОТ клиентов РЕГИСТРИРУЙТЕСЬ кампании ПО customers.id = campaigns.customerid ГДЕ campaigns.name LIKE 'А' или 'В' ГРУППА campaigns.name LIKE ПО customers.id; Он должен работать. – Sabari

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