【问题标题】:How to combine 03 SELECT statements / MySQL queries for single MySQL table如何组合 03 SELECT 语句 / MySQL 查询单个 MySQL 表
【发布时间】:2017-04-03 15:54:28
【问题描述】:

我希望从单个 MySQL 表中提取:

  1. 向今天生日且在接下来的 06 天内生日的用户发送电子邮件。

查询:

SELECT * 
FROM  table_01
WHERE  DATE_ADD(date_of_birth, INTERVAL YEAR(CURDATE())-YEAR(date_of_birth)
       + IF(DAYOFYEAR(CURDATE()) = DAYOFYEAR(date_of_birth),1,0) YEAR) 
    BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 6 DAY);
  1. 向年仅 01 岁 / 365 天的用户发送电子邮件。

查询:

SELECT *, TIMESTAMPDIFF(day, date_of_registration, NOW()) 
 FROM table_01 
 WHERE TIMESTAMPDIFF(day, date_of_registration, NOW()) = 365;
  1. 向男性用户发送电子邮件。

    SELECT * FROM table_01 where gender = male;

我使用了 JOIN、UNION 命令但仍然无法正常工作。

请指教。

【问题讨论】:

  • 您能否添加您的表架构以获得更好的想法...
  • 不需要连接、联合等。简单地将 3 个 where 子句条件与 OR 结合起来
  • where gender = male 在这里已经失败了;引用字符串文字。
  • 如果要使用 UNION,则所有三个查询的选定列数必须相等。在第二个查询中,您又选择了一列 (TIMESTAMPDIFF(day, date_of_registration, NOW()))。

标签: mysql


【解决方案1】:
SELECT *,
    IF(DATE_ADD(`date_of_birth`, INTERVAL YEAR(CURDATE())-YEAR(`date_of_birth`) + IF(DAYOFYEAR(CURDATE()) = DAYOFYEAR(`date_of_birth`),1,0) YEAR) BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 6 DAY),1,0) as `matchtype1`,
    IF(TIMESTAMPDIFF(day, `date_of_registration`, NOW()) = 365,1,0) as `matchtype2`,
    IF(`gender` = 'male',1,0) as `matchtype3`
FROM `table_01`
WHERE (DATE_ADD(`date_of_birth`, INTERVAL YEAR(CURDATE())-YEAR(`date_of_birth`) + IF(DAYOFYEAR(CURDATE()) = DAYOFYEAR(`date_of_birth`),1,0) YEAR) BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 6 DAY))
    AND (TIMESTAMPDIFF(day,`date_of_registration`, NOW()) <= 365)
    AND (`gender` = 'male')
ORDER BY `date_of_registration`;

【讨论】:

  • 感谢 Sloan Thrasher。我很接近它。但这也是出生日期在本周并且在 365 天之前注册的返回用户。我正在寻找:生日是今天和未来06天内的用户,但仅在最近365天内注册的用户,并且是男性。
  • 您的问题并不清楚。您有 3 个单独的查询,并且您说您只想合并结果。如果我理解正确,现在您想要这三个查询的唯一交集。此外,一个似乎不正确 - 在最近 365 天内注册。在您的查询中,它是在 365 天前注册的(即 364 和 366 将无法包含在内)。
  • 我已根据您的最新要求编辑了答案。
【解决方案2】:

不完全确定我完全理解这种需求。 (我一直关注到性别位。)我没有你的架构,所以这是未经测试的。

 SELECT *
  ,FLOOR(DATEDIFF(dd,date_of_birth,GETDATE()) / 365.25) AS AGE_NOW
  ,FLOOR(DATEDIFF(dd,date_of_birth,GETDATE() + 6) / 365.25) AS AGE_SIX_DAYS_FROM_NOW
  ,TIMESTAMPDIFF(day, date_of_registration, NOW()) AS ACCOUNT_AGE
FROM "table_01" EMP
WHERE 1 = (FLOOR(DATEDIFF(dd,EMP.date_of_birth,GETDATE()+7) / 365.25))
          -
          (FLOOR(DATEDIFF(dd,EMP.date_of_birth,GETDATE()) / 365.25))
          OR (ACCOUNT_AGE = 365)
          OR (EMP.gender = 'male');

【讨论】:

    【解决方案3】:

    UNION 没有运行,因为第二个查询比其他查询多返回一列:

    SELECT *, TIMESTAMPDIFF(day, date_of_registration, NOW()) 
     FROM table_01 
     WHERE TIMESTAMPDIFF(day, date_of_registration, NOW()) = 365;
    

    因此您需要向其他查询添加一列或删除第二列。

    你在所有查询中都使用一个表,为什么三个查询只使用一个并使用 or

    select 
        *, TIMESTAMPDIFF(day, date_of_registration, NOW())
      from table_01 where 
     (condition of the first query)
       or 
     (condition of the second query)
      or 
    (condition of the third query)
    

    【讨论】:

      【解决方案4】:

      您是否使用了两个“;”,也许这就是问题所在。

      SELECT SUM(...) AS AEROWiz
      FROM ...
      
      UNION
      
      SELECT SUM(...) AS AEROWiz
      FROM ...
      

      您还可以使用 AND|OR 组合第一条和第三条 sql 语句

      【讨论】:

      • 你在总结什么/为什么总结?
      猜你喜欢
      • 2016-01-04
      • 2012-09-19
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      • 2014-10-18
      • 2011-11-05
      • 2013-07-31
      相关资源
      最近更新 更多