将 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%'
我有一个植物列表,可以用 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%'