我想创建一个具有多个输入参数的查询,其中一些可以为空。
此查询用于从数据库中获取数据,具体取决于用户输入的值。
例如,他只能选择小时的开始和结束日期,或者只选择产品等......
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 *
),是否可以从列中获取所有数据?我是否需要对每种可能性进行查询?
答案 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到∞(无限)的序列大小。