在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