选择与特定值匹配的所有列,这些值可以为空

时间:2015-04-30 09:07:04

标签: php mysql sql

我想创建一个具有多个输入参数的查询,其中一些可以为空。

此查询用于从数据库中获取数据,具体取决于用户输入的值。

例如,他只能选择小时的开始和结束日期,或者只选择产品等......

SELECT 
    cl.checklist_id AS id,
    cl.checklist_indice AS indice,
    cl.checklist_produit_id AS produitId,
    cl.checklist_personne_id AS personneId,
    cl.checklist_date AS date,
    cl.checklist_heure AS heure,
    cl.checklist_machine_id AS machineID
FROM
    checklist cl,
    personne p,
    produit pr
WHERE cl.checklist_id IN (SELECT 
            cl.checklist_id
        FROM
            checklist cl
        WHERE
           :heureStart <= cl.checklist_heure
                AND cl.checklist_heure <= :heureEnd
                AND cl.checklist_id IN (SELECT 
                    cl.checklist_id
                FROM
                    checklist cl
                WHERE
                    :dateStart <= cl.checklist_date
                        AND cl.checklist_date <= :dateEnd
                        AND cl.checklist_id IN (SELECT 
                            cl.checklist_id
                        FROM
                            checklist cl
                        WHERE
                            cl.checklist_produit_id = :produitId
                                AND cl.checklist_id IN (SELECT 
                                    cl.checklist_id
                                FROM
                                    checklist cl
                                WHERE
                                    cl.checklist_machine_id = :machineId
                                        AND cl.checklist_id IN (SELECT 
                                            cl.checklist_id
                                        FROM
                                            checklist cl
                                        WHERE
                                            cl.checklist_personne_id = :personneId)))));

如果我希望此查询起作用,我必须填写所有值以获取数据。

如果值为空(如列上的SELECT *),是否可以从列中获取所有数据?我是否需要对每种可能性进行查询?

2 个答案:

答案 0 :(得分:1)

也许是这样的查询?你必须查询每种可能性,但不能像你那样查询嵌套查询......

SELECT cl.checklist_id AS id,
  cl.checklist_indice AS indice,
  cl.checklist_produit_id AS produitId,
  cl.checklist_personne_id AS personneId,
  cl.checklist_date AS date,
  cl.checklist_heure AS heure,
  cl.checklist_machine_id AS machineID
FROM checklist cl, personne p, produit pr
WHERE (:heureStart is null OR :heureStart <= cl.checklist_heure)
      AND ((:dateStart is null AND :dateEnd is null) OR (:dateStart <= cl.checklist_date AND cl.checklist_date <= :dateEnd))
      AND (:produitId is null OR cl.checklist_produit_id = :produitId)
      AND (:machineId is null OR cl.checklist_machine_id = :machineId)
      AND (:personneId is null OR cl.checklist_personne_id = personneId);

答案 1 :(得分:0)

我找到了成功符合我问题的查询,这里是:

SELECT cl.checklist_id AS id,
    cl.checklist_indice AS indice,
    cl.checklist_produit_id AS produitId,
    cl.checklist_personne_id AS personneId,
    cl.checklist_date AS date,
    cl.checklist_heure AS heure,
    cl.checklist_machine_id AS machineId

FROM checklist cl

WHERE (cl.checklist_date BETWEEN :dateStart AND :dateEnd)
    AND (cl.checklist_heure BETWEEN :heureStart AND :heureEnd)
    AND cl.checklist_produit_id REGEXP :produitId
    AND cl.checklist_machine_id REGEXP :machineId
    AND cl.checklist_personne_id REGEXP :personneId;

这是PHP代码(对于每个必须检查的变量):

if(strlen($variable) == 0){
            $variable= "^.*$";
}

REGEXP匹配所有字符,从0到∞(无限)的序列大小。