将 WHERE 语句与 CONCAT 结合使用时,所有记录均未显示

All records not showing when using a WHERE statement with CONCAT

我有一个植物列表,可以用 CONCAT 过滤,最初它只是文本,但我已将其转换为 ID。它显示了所有记录,并且可以在我转换为 ID 之前进行过滤。

这涉及到4个表。 (带有示例数据)字段中不使用“”,它们只是为了向您表明它是一个词。

工厂

idplant example 1
plantname example "001 Forklift"
idplanttype1 example 1
idlocation1 example 1
iddepartment1 example 1

植物类型

idplanttype example 1
planttype example "Forklift Truck"

地点

idlocation example 1
location example "Preston"

部门

iddepartment example 1
department example "Waste Disposal"

如果没有 WHERE 语句,它会显示所有记录,包括空值。 (但过滤器不起作用)

但是对于 WHERE 语句,它只显示完整的记录(所有这些都没有 Null 字段并且过滤器有效)具有空值的记录不显示

问题似乎出在 CONCAT 上。 (我已经清理了括号,但必须添加一个 1 以使 id 不同)

if(isset($_POST['search'])) {$valueToSearch = $_POST['valueToSearch'];}

$sql = "
SELECT idplant, plantname, planttype, location, department
FROM plant

LEFT JOIN planttypes ON idplanttype1 = idplanttype
LEFT JOIN locations ON idlocation1 = idlocation
LEFT JOIN departments ON iddepartment1 = iddepartment

WHERE CONCAT(plantname, planttype, location, department) LIKE 
'%".$valueToSearch."%' 

ORDER BY plantname";

解决方案 上面的代码有效,它只是丢失了。

WHERE CONCAT_WS

我是 Joins 新手,如有任何帮助,我们将不胜感激。

编辑:使用 Linux 服务器 - Apache 版本 2.4.46

提前致谢!

你的问题可能是空白

WHERE CONCAT(plantname, planttype, location, department) 
 LIKE '%001 Forklift Forklift Truck Preston Waste Disposal%' 
例如,

不会找到任何内容,因为连接的字符串会导致 '001 ForkliftForklift TruckPrestonWaste Disposal',而不是 '001 Forklift Forklift Truck Preston Waste Disposal'

您希望子字符串之间有空格,这是最容易实现的 CONCAT_WS:

SELECT p.idplant, p.plantname, pt.planttype, l.location, d.department
FROM plant p
INNER JOIN planttypes pt ON pt.idplanttype = p.idplanttype1
INNER JOIN locations l ON l.idlocation = p.idlocation1
INNER JOIN departments d ON d.iddepartment = p.iddepartment1
WHERE CONCAT_WS(' ', p.plantname, pt.planttype, l.location, d.department) 
        LIKE '%001 Forklift Forklift Truck Preston Waste Disposal%'