繁体   English   中英

协助MySQL查询和时间戳

[英]Assistance with MySQL query & timestamps

我正在尝试创建一个查询,该查询返回属于start_date和end_date中的club_id的所有行的商品,但是查询还应返回与club_id匹配且end_date为0的任何结果 - 任何关于如何获取的想法做这个? 我目前的疑问是......

SELECT 
    * , 
    UNIX_TIMESTAMP( start_date ) AS start_dateStamp, 
    UNIX_TIMESTAMP( end_date ) AS end_dateStamp 
FROM 
    (`offers`) 
WHERE 
    UNIX_TIMESTAMP(  `start_date` ) <1329308797 
AND 
    UNIX_TIMESTAMP(  `end_date` ) >1329308797 
AND 
    `club_id` =23
SELECT
  `offers`.* ,
  UNIX_TIMESTAMP( start_date ) AS start_dateStamp, 
  UNIX_TIMESTAMP( end_date ) AS end_dateStamp 
FROM `offers`
  WHERE  `club_id` =23
  AND (
    (
      `start_date`<FROM_UNIXTIME(1329308797)
       AND `end_date`>FROM_UNIXTIME(1329308797)
    )
    OR `end_date`=FROM_UNIXTIME(0)
  )

请注意,我将转换从unix-timestamp移动到MySQL-date从字段到常量 - 这样它只需转换一次,而不是所有行。 另外,这种方式可以使用索引。

编辑

“date zero”不是Unix-Zero,而MySQL-Zeor应该是最后一行

OR `end_date`='0000-00-00'

另外,如果start_dateend_date的数据类型不是DATETIME而是DATE ,则需要

DATE(FROM_UNIXTIME(...))

代替

FROM_UNIXTIME(...)

你没有指定end_date = 0还要求start_date > $timestamp ,所以我假设start_date仍然必须符合它的标准。

SELECT 
  please_name, 
  the_columns, 
  you_want_to_select_seperately,
  for_reasons,
  UNIX_TIMESTAMP(start_date) AS start_dateStamp, 
  UNIX_TIMESTAMP(end_date) AS end_dateStamp 
 FROM `offers`
WHERE `club_id` = 23
  AND `start_date`) < UNIX_TIMESTAMP(1329308797)
  AND (`end_date` > UNIX_TIMESTAMP(1329308797) OR `end_date` = "0000-00-00")

关于SQL的一些注意事项:

  1. 除非有理由否则不要使用* 从您最初的问题来看,您真的不是
  2. 尝试格式化代码,使其可读
  3. 对您的条件进行排序,以便首先选择记录最少的条件(读取:具有最高的特异性)。 这已经比暗示MySQL优化器更加令人费解,这仍然是我要遵守的惯例
  4. 如果比较(日期)范围,请考虑使用col BETWEEN min_val and max_val (边界包括在内)
  5. 不要在WHERE和GROUP BY子句中使用函数。 MySQL无法缓存/索引这些,因此必须通过该函数运行每一行的值。 UNIX_TIMESTAMP()有一个名为FROM_UNIXTIME()的朋友-几乎完全相反。 不过,这不是你在PHP中用date()做的事情。
  6. 如果字段具有未知值,请考虑将字段设置为NULL 您有一个日期(2012-02-15)或没有(NULL)。 这将允许您的查询只是检查OR end_date IS NULL

这是你想要的吗?

SELECT *
     , UNIX_TIMESTAMP(start_date) AS start_dateStamp
     , UNIX_TIMESTAMP(end_date) AS end_dateStamp
FROM
  `offers`
WHERE
  (UNIX_TIMESTAMP(`start_date`) < 1329308797 AND UNIX_TIMESTAMP(`end_date`) > 1329308797)
  OR
  (`club_id` = 23 AND `end_date` = '0000-00-00 00:00:00')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2025 STACKOOM.COM