Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql在连接中连接并搜索组。\u连接值_Mysql_Sql_Pdo - Fatal编程技术网

mysql在连接中连接并搜索组。\u连接值

mysql在连接中连接并搜索组。\u连接值,mysql,sql,pdo,Mysql,Sql,Pdo,我似乎找不到搜索组连接值的解决方案 我有3个与id相连的表 第一个表与第二个表的值相同,但与第三个表的值不相同, 第二个表的值与第一个表和第三个表的值相同, 我想得到第三个表中的值, 根据第二个表的不同ID来计算值,显示它们,并能够进行搜索 这是我的桌子 如何搜索连接的值 如果有更好的办法,我非常感谢你的帮助 下面的问题是我到目前为止的问题 $query = $db->prepare(" SELECT a.problem_encountered, GROUP

我似乎找不到搜索组连接值的解决方案

我有3个与id相连的表

第一个表与第二个表的值相同,但与第三个表的值不相同, 第二个表的值与第一个表和第三个表的值相同, 我想得到第三个表中的值, 根据第二个表的不同ID来计算值,显示它们,并能够进行搜索 这是我的桌子

如何搜索连接的值 如果有更好的办法,我非常感谢你的帮助

下面的问题是我到目前为止的问题

$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