【问题标题】:MySQL condition on joined data连接数据的 MySQL 条件
【发布时间】:2014-01-18 11:41:19
【问题描述】:

我有两个表“客户”和“活动”:

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


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

一个客户可以有多个广告系列。两个表之间的关联是通过campaigns.customers_id = customers.id。 现在我想获取所有已获得名称为“A”和名称为“B”的活动的客户。

我尝试了带有IN 语句的JOIN,但它返回了所有已收到广告系列“A”或“B”的客户:

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

非常感谢!

【问题讨论】:

  • 您加入了错误的列。另外... Group by ... 具有 count(*) = n - 其中 n 为否。 IN() 中的项目数(假设 (customer,campaign) 是唯一的
  • Strawberry:感谢您指出列名。你是对的,编辑了我的问题。

标签: mysql select join


【解决方案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')

这应该工作:)

【讨论】:

  • 对不起,这是我的问题中的一个错字。我加入了正确的列,使用 IN 给了我所有拥有活动“A”或“B”的客户,但我想要所有拥有这两个活动的客户。
  • SELECT customers.name FROM customers 在 customers.id=campaigns.customerid 上加入活动它应该可以工作。
【解决方案2】:

您需要为每个广告系列加入

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'

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

【讨论】:

  • 是的,很好的更新,但不仅仅是编写查询,它更好地帮助人们了解你做了什么以及为什么做某事。也许通过左连接澄清为什么双重加入以及为什么你的原始答案不正确。只是给出答案的人不会学习并成为脚本复制者。 (只是建设性的批评......我也很早就开始使用更简单的答案)。
  • 这个解决方案的可扩展性不是很好。
【解决方案3】:
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 的行。

【讨论】:

  • 我不知道为什么这个答案被否决了。谁能解释一下?
  • 感谢您的回答!不知道反对票。当我将“LEFT JOIN”更改为“INNER JOIN”时,它会返回预期的结果。
猜你喜欢
  • 2015-09-20
  • 1970-01-01
  • 2010-11-18
  • 2023-03-09
  • 2021-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多