我尝试解决了一段时间,但没有解决。
我从装满移动设备的表中读取并列出了它们,并为用户提供了根据“移动设备名称”和“用户名”搜索列表的可能性。
这是我的代码:
SELECT
*
FROM
tbl_mobdev
LEFT JOIN
tbl_mobdev_type ON mobdev_type_id = mobdev_type
LEFT JOIN
tbl_marke ON marke_id = mobdev_type_marke
LEFT JOIN
tbl_user ON tbl_user.id = mobdev_user
WHERE
CONCAT(tbl_marke.marke_name,' ',tbl_mobdev_type.mobdev_type_bezeichnung) LIKE '%".$_POST['marke_name']."%'
AND
CONCAT(tbl_user.name,' ',tbl_user.vorname) LIKE '%".$_POST['user']."%'
AND
mobdev_aktiv = '1'
ORDER BY
".$_GET['sort']." ".$_GET['sort2']."
只要tbl_mobdev.mobdev_user包含一个User-ID,而所有不包含User-ID的表行都被排除,一切都会按预期进行。
有什么解决办法吗?
编辑:将“过滤器”放在tbl_user的LEFT JOIN中的解决方案不起作用。每行将显示类似以下结果的SQL。如果LIKE仅包含不匹配的结果,则不会加入该行,因此不会对该行进行过滤。
SELECT mobdev_id, mobdev_type_bezeichnung, marke_name, tbl_user.name AS user_name, tbl_user.vorname AS user_vorname
FROM tbl_mobdev
LEFT JOIN tbl_mobdev_type ON mobdev_type_id = mobdev_type
LEFT JOIN tbl_marke ON marke_id = mobdev_type_marke
LEFT JOIN tbl_user ON tbl_user.id = mobdev_user
AND CONCAT( tbl_user.name, ' ', tbl_user.vorname ) LIKE '%%'
WHERE CONCAT( tbl_marke.marke_name, ' ', tbl_mobdev_type.mobdev_type_bezeichnung ) LIKE '%%'
AND mobdev_aktiv = '1'
ORDER BY marke_name ASC
LIMIT 0 , 30
Edit2:将SQL设置为以下内容不会更改行为。
SELECT mobdev_id, mobdev_type_bezeichnung, marke_name, tbl_user.name AS user_name, tbl_user.vorname AS user_vorname
FROM tbl_mobdev
LEFT JOIN tbl_mobdev_type ON mobdev_type_id = mobdev_type
LEFT JOIN tbl_marke ON marke_id = mobdev_type_marke
LEFT JOIN tbl_user ON tbl_user.id = mobdev_user
AND CONCAT( tbl_user.name, ' ', tbl_user.vorname ) LIKE '%G%'
WHERE CONCAT( tbl_marke.marke_name, ' ', COALESCE( tbl_mobdev_type.mobdev_type_bezeichnung, '' ) ) LIKE '%%'
AND mobdev_aktiv = '1'
ORDER BY marke_name ASC
LIMIT 0 , 30
没有匹配$ _POST ['user']的行仍不会被过滤掉。
我上传了一个带有模糊名称的行为的示例图片,左侧picute是一个没有任何过滤器的Select,右侧pictura是具有实际用户名的Select(已模糊显示,但其名称与mobdev_id'3'中的名称完全相同。
http://fs5.directupload.net/images/160404/tmdbyzws.png
如您所见,其他五行仍然存在,只是没有联接。我希望它们完全消失,因为它们与过滤器不匹配。
Edit3:好吧,我现在做到了……使用PHP的方式非常糟糕。我只是将代码留在此处,如果有人为此提出了更好的解决方案,请告诉我。
$query = "
SELECT
mobdev_id,
mobdev_type_bezeichnung,
marke_name,
tbl_user.name AS user_name,
tbl_user.vorname AS user_vorname
FROM
tbl_mobdev
LEFT JOIN
tbl_mobdev_type ON mobdev_type_id = mobdev_type
LEFT JOIN
tbl_marke ON marke_id = mobdev_type_marke
LEFT JOIN
tbl_user ON tbl_user.id = mobdev_user
WHERE
CONCAT(tbl_marke.marke_name,' ',tbl_mobdev_type.mobdev_type_bezeichnung) LIKE '%".$_POST['marke_name']."%'
";
if($_POST['user'])
{
$query .= "
AND
CONCAT(tbl_user.name,' ',tbl_user.vorname) LIKE '%".$_POST['user']."%'
";
}
$query .= "
AND
mobdev_aktiv = '1'
ORDER BY
".$_GET['sort']." ".$_GET['sort2']."
";
问题出在行中
CONCAT(tbl_user.name,' ',tbl_user.vorname) LIKE '%".$_POST['user']."%'
您在tbl_user上的LEFT JOIN将允许主查询返回,而与该行中是否有值无关。但是,该特定的WHERE子句行有效地覆盖了该行;如果tbl_user.name或tbl_user.vorname为null,则结果将始终为false。
如果需要执行类似的操作,则通常将测试放入JOIN语句的ON子句中。这样,它会过滤已存在的JOINed表,但不会在不存在的地方引起问题。
示例查询文本应确保在需要时过滤tbl_user,但在未指定任何内容时不过滤-
SELECT
md.mobdev_id,
mdt.mobdev_type_bezeichnung,
m.marke_name,
u.name AS user_name,
u.vorname AS user_vorname
FROM
tbl_mobdev md
LEFT JOIN tbl_mobdev_type mdt
ON mdt.mobdev_type_id = md.mobdev_type
LEFT JOIN tbl_marke m
ON m.marke_id = mdt.mobdev_type_marke
LEFT JOIN tbl_user u
ON u.id = md.mobdev_user
AND CONCAT(u.name,' ',u.vorname) LIKE '%".$_POST['user']."%'
WHERE
CONCAT(m.marke_name,' ',COALESCE(mdt.mobdev_type_bezeichnung,''))
LIKE '%".$_POST['m.marke_name']."%'
AND md.mobdev_aktiv = '1'
ORDER BY
".$_GET['sort']." ".$_GET['sort2']."
两个助手-
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句