【问题标题】:MySQL: adding conditions in SELECTMySQL:在 SELECT 中添加条件
【发布时间】:2013-04-01 07:23:42
【问题描述】:

我有一个巨大的 SELECT,我需要在其中创建一些条件。

例如:

SELECT `t`.`title`, `t`.`price_paid`, `t`.`date_creation`, `t`.`date_upload` 
  FROM `table_name` AS `t`
 WHERE `t`.`date_creation` >= "'.$year.'-'.$month.'-01" 
   AND `t`.`date_creation` < "'.$year.'-'.($month+1).'-01"

我在 PHP 中声明了 $year 和 $month 的值,我希望在 MYSQL 中生成其余的值(如果需要,我有充分的理由可以详细说明)

如果 date_upload 与 t.date_creation 的间隔不同,我需要将 date_upload 设为空(null 或 0)和 price 也为空

【问题讨论】:

  • 能否在 PHP 中动态创建 SQL 语句并将变量传递给您的查询对象?
  • 让我们为您的查询使用参数“?” (这是 SQL 语法,而不是 PHP)。 PHP 端只需使用 bindValue() 添加预先计算的参数值。要使它们为空,您不能使用 WHERE 而是使用 CASE 语句(如果不满足条件,则仅使用 THEN NULL)
  • @Matt Busche 当然可以,有什么想法吗?这个/实际查询的结果是一个巨大的数组,我用它来构建一个 CSV 报告。我正在使用一些已经制作的库来插入查询和结构
  • @tadman 感谢您的提示,我仍然很安全,因为一切都在一个框架内,并且在我们的数据中注入东西并不容易,因为这种类型的东西有一些层: )

标签: php mysql select conditional-statements


【解决方案1】:

不要那样做日期数学。如果你在 12 月,你会要求 MySQL 在高端寻找2013-13-01。使用实际的 mysql 日期数学:

SELECT ...
WHERE t_date_creation BETWEEN (now() - INTERVAL 1 MONTH) AND (now() + INTERVAL 1 MONTH)

对于您的查询,它将是一个 UPDATE 查询:

UPDATE yourtable
SET date_upload = NULL, price = NULL
WHERE date_restriction_logic_here.

【讨论】:

  • 日期的好点。我将在那里使用 SQL 仍然需要涵盖上个月从 1 到结束的全部内容。
  • 更新在我的情况下不起作用。我进行查询并将结果打印在 CSV 报告文件中,因此到目前为止没有保存在 db 中。其他建议?
  • 似乎 IF(condition, value if true, value if false) 最接近我需要的值,我将在下面添加解决方案
【解决方案2】:

到目前为止的解决方案似乎是:

-> MySQL 在选择查询中嵌套“If”

IF(条件,真值,假值)

类似

选择t.title, if (t.date_creation >= "'.$year.'-'.$month.'-01" AND t.date_upload t.price_paid, '0') 作为price_paid, t.date_creation, if (t.date_creation >= "'.$year.'-'.$month.'-01" AND t.date_upload t.date_upload, '') 作为date_upload 发件人table_name 发件人t WHERE t.date_creation >= "'.$year.'-'.$month.'-01" AND t.date_creation

其他解决方案似乎是控制流函数

CASE 值 WHEN [compare_value] THEN 结果 [WHEN [compare_value] THEN 结果 ...] [ELSE 结果] END

发现于http://komlenic.com/254/mysql-nested-if-in-select-queries/ http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-17
    • 2018-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    • 2013-04-08
    相关资源
    最近更新 更多