【问题标题】:Select multiple conditions where one can be null选择多个条件,其中一个可以为空
【发布时间】:2021-07-01 06:08:55
【问题描述】:

我将几个参数传递给 mysql 查询。其中一些可以是“全部”或“空”。我怎样才能使用一个查询呢?

如何传递,例如,action=ALL、user=3、what=ALL。 ALL 我的意思是所有可能的行动选项。

SELECT id, user, action, what, from_value, to_value, updated_date 
from history 
where (user=? and action=? and what=?) 
order by updated_date DESC

【问题讨论】:

    标签: mysql select multiple-conditions


    【解决方案1】:

    您可以使用WHERE field_name IS NULLWHERE field_name IS NOT NULL 专门过滤某事物是否为NULL。如果字段的值无关紧要,则无需将其包含在 WHERE 子句中。

    在您的示例中,您正在构建基于 POST 数据的查询。如果你想过滤$h_action的值,但$h_action为null也没关系,你可以这样做:

    WHERE (action = ? OR action IS NULL)

    您可以将它们与ANDs 链接到多个字段:

    WHERE (action = ? OR action IS NULL) AND (what = ? OR what IS NULL) AND ...

    【讨论】:

    • 没关系,但是应该用什么来代替“?”。例如,我通过 $h_action = 'add' 并且查询将正确执行选择。但是如果我通过 $h_action = 'all' 呢?我需要更改参数“?”类似于“*”
    • 那些?s代表你的POST数据,通过mysqli_stmt_bind_param填写。
    • 好的,假设我有三个操作:全部、添加、编辑。例如,我想选择特定的用户,但操作应该是全部。 DB中没有这样的,这意味着我应该选择所有动作。但我需要传递一些参数而不是“?”。它应该是“全部”的意思,对吧?
    • 啊,我想我现在可能明白了。没有(简洁的)方法可以明确地告诉 MySQL“任何值都适用于该列”,同时还要将该列包含在 WHERE 子句中。您最好的解决方案是执行额外的 PHP 来检查 $h_action 是否为 all;如果是,请使用不过滤 action 列的查询。也就是说,你可以通过类似WHERE action = CASE WHEN $h_action <> 'all' THEN $h_action ELSE action END(根据需要替换$h_action)来欺骗MySQL,但这有点恶心。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    相关资源
    最近更新 更多