mysql - 太多的子查询会导致内部服务器错误500吗?

标签 mysql subquery internal-server-error

// initialized null variables
        $sql_for_training = null;
        $sql_for_screening = null;
        $sql_for_all = null;
        $sqlforpositions = null;

        $sql0 = 'SELECT * FROM lib_positions';

        $result0 = $db->fetchAll($sql0);


        $city_query = "";
        // append additional query
        if(isset($data['region_id'])){
            $sql_for_training.=" AND p.region = '".$data['region_id']."' ";
            $sql_for_screening.=" AND p.region_address = ".$data['region_id']." ";
            $sql_for_all.= " AND ".$data['table'].".region_id = ".$data['region_id'];
            // $sqlforpositions = "";
        }
        if(isset($data['province_id'])){
            $sql_for_training.=" AND p.province = ".$data['province_id']." ";
            $sql_for_screening.=" AND p.province_address = ".$data['province_id']." ";
            $sql_for_all.= " AND ".$data['table'].".province_id = ".$data['province_id'];
            // $sqlforpositions = "";
        }
        if(isset($data['city_id'])){
            $sql_for_training.=" AND p.city_municipality = ".$data['city_id']." ";
            $sql_for_screening.=" AND p.city_municipality_address = ".$data['city_id']." ";
            $sql_for_all.= " AND ".$data['table'].".city_municipality_id = ".$data['city_id'];
            $sqlforpositions = "";
            $city_query = "LIMIT 1";
        }

        // build query string.
        $sql = "SELECT ".$data['table'].".id AS table_id, ".$data['table'].".".$data['type']."_desc AS ".$data['type']."_desc,
                    l_p.position_desc as position_desc,

                    (SELECT count(p.id) FROM tbl_personal_info AS p
                        INNER JOIN tbl_screening AS s ON p.id = s.candidate_id
                        INNER JOIN tbl_position_applied AS p_a ON s.candidate_id = p_a.candidate_id
                        WHERE p.".$data['type']."_address = ".$data['table'].".id
                        AND p_a.position_id = l_p.id
                        ".$sql_for_screening.") AS screening,


                    (SELECT count(p.id) FROM tbl_personal_info AS p 
                        INNER JOIN tbl_screening AS s ON p.id = s.candidate_id
                        INNER JOIN tbl_position_applied AS p_a ON s.candidate_id = p_a.candidate_id
                        WHERE s.screening_id = 6 AND
                        p.".$data['type']." = ".$data['table'].".id 
                        AND p_a.position_id = l_p.id
                        ".$sql_for_screening.") AS prescreened,

                    (SELECT count(p.id) FROM tbl_personal_info AS p 
                        INNER JOIN tbl_screening AS s ON p.id = s.candidate_id
                        INNER JOIN tbl_position_applied AS p_a ON s.candidate_id = p_a.candidate_id 
                        WHERE s.screening_id = 4 AND 
                        p.".$data['type']." = ".$data['table'].".id
                        AND p_a.position_id = l_p.id
                        ".$sql_for_screening.") AS qualified,

                    (SELECT count(p.id) FROM tbl_personal_info AS p 
                        INNER JOIN tbl_training AS tr ON p.id = tr.candidate_id
                        INNER JOIN tbl_position_applied AS p_a ON tr.candidate_id = p_a.candidate_id 
                        WHERE p.".$data['type']." = ".$data['table'].".id
                        AND p_a.position_id = l_p.id
                        ".$sql_for_training.") AS training,

                    (SELECT count(p.id) FROM tbl_personal_info AS p 
                        INNER JOIN tbl_training AS tr ON p.id = tr.candidate_id 
                        INNER JOIN tbl_position_applied AS p_a ON tr.candidate_id = p_a.candidate_id 
                        WHERE  tr.status = 2 AND p.".$data['type']." = ".$data['table'].".id
                        AND p_a.position_id = l_p.id
                        ".$sql_for_training.") AS failed,

                    (SELECT count(p.id) FROM tbl_personal_info AS p 
                        INNER JOIN tbl_training AS tr ON p.id = tr.candidate_id 
                        INNER JOIN tbl_position_applied AS p_a ON tr.candidate_id = p_a.candidate_id 
                        WHERE  tr.status = 1 AND p.".$data['type']." = ".$data['table'].".id
                        AND p_a.position_id = l_p.id
                        ".$sql_for_training.") AS passed,

                    (SELECT count(p.id) FROM tbl_personal_info AS p 
                        INNER JOIN tbl_requirements AS t_r ON p.id = t_r.candidate_id
                        INNER JOIN tbl_position_applied AS p_a ON p.id = p_a.candidate_id 
                        WHERE (SELECT count(t_r.candidate_id) FROM tbl_requirements AS t_r WHERE candidate_id = p.id) = (SELECT count(l_r.id) FROM lib_requirements as l_r)
                        AND p_a.position_id = l_p.id
                        ".$sql_for_training.") AS completed,

                    t.target as target,
                    t.screening_target as screening_target,
                    t.training_target as training_target

                FROM ".$data['table']."
                RIGHT JOIN tbl_target as t on ".$data['table'].".id = t.area_id
                LEFT JOIN lib_positions as l_p on t.position_id = l_p.id
                WHERE t.area_type ='".$data['type']."'"
                .$sql_for_all;

        // execute query string
        // echo "<pre>".$sql."</pre>";


        $result = $db->fetchAll($sql);

        $db->closeConnection();
        //Zend_Debug::dump($result);

        //die();
        return $result;

当我获取 10 行时。结果如我所愿。但是当查询尝试获取超过 15 行时。我导致内部服务器 500 错误。我的 tbl_personal_info 目前有 2300 行。我的 tbl_region 中有 7 个区域,lib_provinces 表中有大约 200 多个省份,还有 1000 多个 lib_city_municipality。我的查询做错了吗?或者我只是使用了太多子查询?谢谢大家的帮助。

最佳答案

问题已解决

选择 lr.id AS table_id, lr.".$data['type']."_desc AS ".$data['type']."_desc, lp.position_desc, 计数(lr.id)AS计数区域, count(pi.id) AS 筛查, count(case ts.screening_id if 6 then 1 else null end) AS 预筛选, count(case ts.screening_id if 4 then 1 else null end) AS 合格, count(tt.id) AS 训练, count(case tt.status when 2 then 1 else null end) AS 失败, count(case tt.status when 1 then 1 else null end) AS 通过, 0 已完成, tar.target 作为目标, tar.screening_target 作为筛选目标, tar.training_target 作为training_target

            FROM tbl_personal_info AS pi
            RIGHT JOIN tbl_position_applied AS tpa ON pi.id = tpa.candidate_id
            RIGHT JOIN ".$data['table']." AS lr ON pi.".$data['type']." = lr.id
            LEFT JOIN lib_positions AS lp ON tpa.position_id = lp.id
            INNER JOIN tbl_screening AS ts ON pi.id = ts.candidate_id
            LEFT JOIN tbl_training AS tt ON pi.id = tt.candidate_id
            LEFT JOIN tbl_target AS tar ON lr.id = tar.area_id

            WHERE tar.area_type = '".$data['type']."'
            AND tar.position_id = lp.id
            ".$sql_for_all."
            GROUP BY lr.id,tpa.position_id
            ORDER BY lr.id ASC,lp.id ASC

我使用了这个改进的查询。 :))

关于mysql - 太多的子查询会导致内部服务器错误500吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34718049/

相关文章:

输出表上的 MySQL 子查询

MySQL子查询问题

php - Laravel 5 - 缓存记住不起作用

mysql - 如何在子查询中使用 EXIST?

php - 内部服务器错误 500 - session_start()

javascript - 在 $.ajax 中使用 "POST"方法传递数据时出现 500 Internal Server Error

python - flask - 405,方法不允许

php - 将服务器 MySQL 时间戳转换为 UTC

java - 使用 java 更新数据库条目

mysql - 带有 MySQL 的 Hive-2.3.2 Metastore 无法启动