子查询返回超过1个值”的错误正在运行SQL查询,需要子查询返回超过1个行

在PHP的项目中,我有这个脚本

public static function getAllProjet($actif)
{

    $database = DatabaseFactory::getFactory()->getConnection();

    $sql = "SELECT a.projet_id, a.projet_nom, a.projet_date_ouverture, 
            IF(ISNULL(d.user_id),d.nom,CONCAT(e.prenom,' ',e.nom)) as charge_nom,
            IF(ISNULL(b.compagnie),b.compagnie,CONCAT(b.prenom,' ',b.nom)) as client
            FROM Projet_projet a
            LEFT JOIN User_informations b ON a.user_id = b.user_id
            LEFT JOIN Projet_contact_ici c ON a.projet_id = c.projet_id
            LEFT JOIN Contact_ici_charge d ON c.chargeprojet_id = d.chargeprojet_id
            LEFT JOIN User_informations e ON d.user_id = e.user_id
            WHERE projet_actif = :actif
            ORDER BY a.projet_id DESC";
    $query = $database->prepare($sql);
    $query->execute(array(':actif' => $actif));

    $all_projet_profiles = array();

    foreach ($query->fetchAll() as $projet) {

        $sql = "SELECT (SUM(a.materiel_qte)) AS qte, b.produitFini_nom, c.type_nom, d.couleur_nom
            FROM Projet_materiel a
            LEFT JOIN ProduitFini_base b ON b.produitFini_id = a.projet_produitFini_id
            LEFT JOIN Config_type c ON c.type_id = b.type_id
            LEFT JOIN Config_couleur d ON d.couleur_id = a.materiel_couleur
            WHERE a.projet_id = :projet_id 
            AND a.projet_produitFini_id IS NOT NULL 
            AND materiel_produitFini_materiel_id IS NULL
            GROUP BY b.produitFini_nom, d.couleur_nom";
        $query = $database->prepare($sql);
        $query->execute(array(':projet_id' => $projet_id));

        $materiel = $query->fetchAll();

        $all_projet_profiles[$projet->projet_id] = new stdClass();
        $all_projet_profiles[$projet->projet_id]->projet_id = $projet->projet_id;
        $all_projet_profiles[$projet->projet_id]->projet_nom = $projet->projet_nom;
        $all_projet_profiles[$projet->projet_id]->projet_date_ouverture = $projet->projet_date_ouverture;
        $all_projet_profiles[$projet->projet_id]->projet_client = $client;
        $all_projet_profiles[$projet->projet_id]->charge_nom = $projet->charge_nom;
        $all_projet_profiles[$projet->projet_id]->materiel = $materiel;
        //$all_projet_profiles[$projet->projet_id]->production = ProductionModel::getProduction($projet->projet_id);
        //$all_projet_profiles[$projet->projet_id]->livraison = LivraisonsModel::getLivraison($projet->projet_id);
        $all_projet_profiles[$projet->projet_id]->materiel = null;
        $all_projet_profiles[$projet->projet_id]->production = null;
        $all_projet_profiles[$projet->projet_id]->livraison = null;

    }

    return $all_projet_profiles;
}

此刻,他执行第一个sql查询,对于大约700行的每一行,他都需要执行第二个sql查询以获取物料,我们在其中看到$ materiel =,并且对于生产和生命力都同样认为,它们每个都有多于1行,我需要用较少的sql查询来完成此操作,因为目前执行查询需要90秒钟以上的时间,所以我发现这种方式可以更快地进行查询

public static function getAllProjet($actif)
{
    $database = DatabaseFactory::getFactory()->getConnection();

    $sql = "SELECT a.projet_id, a.projet_nom, a.projet_date_ouverture,
            IF(ISNULL(d.user_id),d.nom,CONCAT(e.prenom,' ',e.nom)) as charge_nom,
            IF(ISNULL(b.compagnie),b.compagnie,CONCAT(b.prenom,' ',b.nom)) as client,



            (SELECT CONCAT((SUM(f.materiel_qte)),' de ',g.produitFini_nom,' ', h.type_nom,' ', i.couleur_nom,'<br>')
            FROM Projet_materiel f
            LEFT JOIN ProduitFini_base g ON g.produitFini_id = f.projet_produitFini_id
            LEFT JOIN Config_type h ON h.type_id = g.type_id
            LEFT JOIN Config_couleur i ON i.couleur_id = f.materiel_couleur
            WHERE f.projet_id = a.projet_id 
            AND f.projet_produitFini_id IS NOT NULL 
            AND materiel_produitFini_materiel_id IS NULL
            GROUP BY g.produitFini_nom, i.couleur_nom LIMIT 1) as materiel


            FROM Projet_projet a
            LEFT JOIN User_informations b ON a.user_id = b.user_id
            LEFT JOIN Projet_contact_ici c ON a.projet_id = c.projet_id
            LEFT JOIN Contact_ici_charge d ON c.chargeprojet_id = d.chargeprojet_id
            LEFT JOIN User_informations e ON d.user_id = e.user_id
            WHERE projet_actif = :actif
            ORDER BY a.projet_id DESC";
    $query = $database->prepare($sql);
    $query->execute(array(':actif' => $actif));

    $all_projet_profiles = array();

    foreach ($query->fetchAll() as $projet) {

        $all_projet_profiles[$projet->projet_id] = new stdClass();
        $all_projet_profiles[$projet->projet_id]->projet_id = $projet->projet_id;
        $all_projet_profiles[$projet->projet_id]->projet_nom = $projet->projet_nom;
        $all_projet_profiles[$projet->projet_id]->projet_date_ouverture = $projet->projet_date_ouverture;
        $all_projet_profiles[$projet->projet_id]->projet_client = $projet->client;
        $all_projet_profiles[$projet->projet_id]->charge_nom = $projet->charge_nom;
        $all_projet_profiles[$projet->projet_id]->materiel = $projet->materiel;
        //$all_projet_profiles[$projet->projet_id]->production = ProductionModel::getProduction($projet->projet_id);
        //$all_projet_profiles[$projet->projet_id]->livraison = LivraisonsModel::getLivraison($projet->projet_id);
        $all_projet_profiles[$projet->projet_id]->materiel = null;
        $all_projet_profiles[$projet->projet_id]->production = null;
        $all_projet_profiles[$projet->projet_id]->livraison = null;

    }

    return $all_projet_profiles;
}

之所以有效,是因为我限制为1,但是我需要所有行。

如果我在PHP中执行此操作,则将花费太多时间,但是当我在SQL中将其限制为1时,它会很快。

如何获取SQL中的所有行而不是PHP?

最后,我想要的是一个包含所有数据的数组,就像在php中一样,但是使用sql

评论