连接数据的MySQL条件

时间:2014-01-18 11:41:20

标签: mysql select join

我有两个表“客户”和“广告系列”:

    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')

非常感谢!

3 个答案:

答案 0 :(得分: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')

这应该有效:)

答案 1 :(得分: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'

现在将包含已同时收到这两者的客户。

答案 2 :(得分: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,您将获得包含广告系列且广告系列名称为“A”的客户,然后结果将与名为“B”的广告系列一起加入。

只会选择campaign.name = Acampaign.name = B的行。