【问题标题】:MYSQL - Query to check against other table (hard to explain...)MYSQL - 查询以检查其他表(很难解释......)
【发布时间】:2010-03-12 02:36:31
【问题描述】:

我有一个查询,其中包含订阅了为期 30 天的时事通讯试用的电子邮件列表。

$thirty = time() - 3024000;

SELECT c.email 
  FROM tbl_clients AS c 
  JOIN tbl_clientoptions AS o ON o.client = c.id 
 WHERE o.option = 'newsletter' 
   AND c.datecreated > $thirty

我想要做的是在同一个查询中进行检查,因此如果他们有 tbl_clientoptions.option = 'trialoverride' (即;客户端选项表中的一行值为“试用覆盖”)

TBL_CLIENTS表:

  • 身份证
  • 姓名
  • 电子邮件
  • 创建日期

TBL_CLIENTOPTIONS表:

  • 身份证
  • 客户
  • 选项

【问题讨论】:

  • 听起来你想UNION 两个选择语句一起,第二个与 TBL_CLIENTOPTIONS 连接
  • 选项表包含时事通讯、促销材料、smsalerts、每月时事通讯等内容,还提供试用覆盖选项。根据勾选的选项,有多行。如果有一个带有时事通讯和短信警报的客户端,将有两行。如果我们取消勾选某项,则会删除一行。我想要做的是选择所有勾选了“时事通讯”且不到 30 天的人,以及所有勾选了“时事通讯”且超过 30 天的人,如果他们勾选了“试用覆盖”。我可能可以做两个查询,但希望一次做..

标签: sql mysql select


【解决方案1】:

怎么样:

SELECT c.email 
   FROM tbl_clients AS c JOIN tbl_clientoptions AS o
   ON o.client = c.id 
   WHERE (o.option = 'newsletter' AND c.datecreated > $thirty) 
     || o.option = 'trialoverride';

【讨论】:

  • 我想我试过这个,但它与另一个“选项”列冲突(即:该行不能同时等于“新闻通讯”和“试用覆盖”)对吗?
  • 抱歉,没看到。我已将其编辑为我认为应该工作的内容。基本上,将 () 移动了一点。
【解决方案2】:

通常只需要一个OR 条件就可以了,如果同一用户用户可以同时拥有这两个条件,则添加一个DISTINCT,否则将其删除:

SELECT DISTINCT c.email 
FROM tbl_clients c 
 INNER JOIN tbl_clientoptions o ON (o.client = c.id) 
WHERE
 (o.option = 'newsletter' AND c.datecreated < $thirty) OR
 (o.option = 'trial override' AND c.datecreated > $thirty);

【讨论】:

    猜你喜欢
    • 2020-12-02
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    相关资源
    最近更新 更多