MySQL:在where子句中使用字段内容
MySQL: Use field content in where clause
假设我有一个 table,其中包含一个 date_last_action
(日期时间)和一个 frequency
(varchar)字段。后者包含表示有效 DATE_ADD 期间的字符串(例如:“1 WEEK”、“1 YEAR”)。
现在我想检索时间已过的所有记录。
这就是我正在尝试的:
SELECT *
FROM `table`
where DATE_ADD(`date_last_action`,INTERVAL `frequency`) < now()
这不起作用。我得到:
Error in query (1064): Syntax error near ') < now()'
我确定这与 frequency
有关。
如何做到这一点?
显然,我可以进行两次调用 - 首先检索频率,然后检查该行是否为 "outdated"。但我想如果我只希望匹配很少的记录,那将使用更多的资源。
不幸的是 MySQL 需要在 INTERVAL 之后有一个关键字,而不是任何字符串或数值。您可以通过使用 CASE 语句并使用不同的关键字给出不同的案例来实现您想要的。
举个例子,假设您想将具有适当单位的值添加到日期,那么 SQL 语句将如下所示:
SELECT CASE unit
WHEN "DAY" THEN date_add(date, INTERVAL value DAY)
WHEN "MONTH" THEN date_add(date, INTERVAL value MONTH)
END
AS newDate
FROM table
但是您需要另一列 unit
!
也适用于 WHERE 子句...
假设我有一个 table,其中包含一个 date_last_action
(日期时间)和一个 frequency
(varchar)字段。后者包含表示有效 DATE_ADD 期间的字符串(例如:“1 WEEK”、“1 YEAR”)。
现在我想检索时间已过的所有记录。
这就是我正在尝试的:
SELECT *
FROM `table`
where DATE_ADD(`date_last_action`,INTERVAL `frequency`) < now()
这不起作用。我得到:
Error in query (1064): Syntax error near ') < now()'
我确定这与 frequency
有关。
如何做到这一点?
显然,我可以进行两次调用 - 首先检索频率,然后检查该行是否为 "outdated"。但我想如果我只希望匹配很少的记录,那将使用更多的资源。
不幸的是 MySQL 需要在 INTERVAL 之后有一个关键字,而不是任何字符串或数值。您可以通过使用 CASE 语句并使用不同的关键字给出不同的案例来实现您想要的。
举个例子,假设您想将具有适当单位的值添加到日期,那么 SQL 语句将如下所示:
SELECT CASE unit
WHEN "DAY" THEN date_add(date, INTERVAL value DAY)
WHEN "MONTH" THEN date_add(date, INTERVAL value MONTH)
END
AS newDate
FROM table
但是您需要另一列 unit
!
也适用于 WHERE 子句...