mysql在连接中连接并搜索组。\u连接值
我似乎找不到搜索组连接值的解决方案 我有3个与id相连的表 第一个表与第二个表的值相同,但与第三个表的值不相同, 第二个表的值与第一个表和第三个表的值相同, 我想得到第三个表中的值, 根据第二个表的不同ID来计算值,显示它们,并能够进行搜索 这是我的桌子 如何搜索连接的值 如果有更好的办法,我非常感谢你的帮助 下面的问题是我到目前为止的问题mysql在连接中连接并搜索组。\u连接值,mysql,sql,pdo,Mysql,Sql,Pdo,我似乎找不到搜索组连接值的解决方案 我有3个与id相连的表 第一个表与第二个表的值相同,但与第三个表的值不相同, 第二个表的值与第一个表和第三个表的值相同, 我想得到第三个表中的值, 根据第二个表的不同ID来计算值,显示它们,并能够进行搜索 这是我的桌子 如何搜索连接的值 如果有更好的办法,我非常感谢你的帮助 下面的问题是我到目前为止的问题 $query = $db->prepare(" SELECT a.problem_encountered, GROUP
$query = $db->prepare("
SELECT
a.problem_encountered,
GROUP_CONCAT(
DISTINCT
c.full_name)
AS
fnames
FROM
maintenance_sheet_table a
LEFT JOIN
mis_incharge_table b
ON
b.mis_incharge_id = a.mis_incharge_id
INNER JOIN
users_table c
ON
c.mis_id=b.mis_id
WHERE
a.problem_encountered
LIKE
:findMe
HAVING
fnames
LIKE
:findMe
GROUP BY a.id ORDER BY a.id
");
$query->bindValue(':findMe', '%' . $keywordSearch. '%');
您可以从HAVING子句中的GROUP_CONCAT表达式中搜索返回。作为一种更有效的替代方法,我怀疑您可以将EXISTS谓词与子查询一起使用 我怀疑部分问题在于您的查询多次引用同一个绑定占位符。在PDO的早期版本中,这是一个限制,命名绑定占位符只能被引用一次 解决此问题的方法是使用单独的绑定占位符,例如
HAVING fnames LIKE :findMeToo
然后将值绑定到每个占位符:
$query->bindValue(':findMe', '%' . $keywordSearch. '%');
$query->bindValue(':findMeToo', '%' . $keywordSearch. '%');
对于这个问题,我不认为PDO发出了警告或错误;其效果就像没有为命名绑定占位符的第二个引用提供值一样。不确定是否通过代码更改或文档更新修复了此问题。如上所述的解决方法是,在查询中只引用一次绑定占位符
除此之外,还不清楚您观察到了什么问题。一个可能的答案是在子查询中过滤Users\u表。此选项有多种不同的形式,很难从您的数据中看出所需的内容。下面的示例只返回符合搜索条件的用户
SELECT a.problem_encountered, GROUP_CONCAT(DISTINCT innerc.full_name) AS fnames
FROM maintenance_sheet_table a
LEFT JOIN mis_incharge_table b ON b.mis_incharge_id = a.mis_incharge_id
LEFT JOIN (SELECT c.mis_id, c.full_name
FROM users_table c
WHERE c.full_name LIKE :findMe) innerc ON innerc.mis_id=b.mis_id
WHERE a.problem_encountered LIKE :findMe
GROUP BY a.id
ORDER BY a.id
但是,如果需要,也可以在子查询中进行连接
SELECT a.problem_encountered, innerc.fnames
FROM maintenance_sheet_table a
INNER JOIN (SELECT mit.mis_incharge_id, GROUP_CONCAT(DISTINCT ut.full_name) AS fnames
FROM users_table ut
INNER JOIN mis_incharge_table mit ON ut.user_id = mit.user_id
GROUP BY mit.mis_incharge_id
HAVING fnames LIKE :findMe) innerc ON innerc.mis_incharge_id = a.mis_incharge_id
WHERE a.problem_encountered LIKE :findMe
GROUP BY a.id
ORDER BY a.id
注意:我同意spencer7593的观点,即不应该对两个单独的字段使用相同的:findMe变量。即使它有效,几年后,对于维护程序员甚至您自己来说,可能会看到这一点并认为正在查询错误的字段。HAVING子句应该位于GROUP BY子句之后
改变
HAVING
fnames
LIKE
:findMe
GROUP BY a.id ORDER BY a.id
到
谢谢simo和spencer,经过一些调整后,我的搜索现在开始工作了,谢谢你们引入子查询^^
GROUP BY a.id
HAVING
fnames
LIKE
:findMe
ORDER BY a.id