简化此 SQL 请求


simplify this SQL request

我有这个sql请求:

SELECT pl.*, l.loyer, l.charges, l.locataire_id, laire.nom, laire.prenom,
       l.chambre_id, c.numero, c.etage, c.maison_id, m.titre_crm 
FROM
    (
    SELECT spl.id, spl.location_id, spl.mois, spl.annee, spl.loyer_paye
    from locations sl 
        LEFT JOIN
            (
            SELECT * FROM paiement_loyer 
            union 
            SELECT 9999, usl.id, (MONTH(NOW())-1), YEAR(NOW()), 0 
            FROM locations usl 
            WHERE usl.id not in (SELECT location_id FROM paiement_loyer) || 
                                (select count(*) FROM paiement_loyer
                                 WHERE location_id = usl.id AND annee = YEAR(NOW())
              AND mois=(MONTH(NOW())-1) ) = 0
            ) spl ON sl.id = spl.location_id
    where sl.date_debut <= CURDATE() && CURDATE() <= sl.date_fin
    ) pl
JOIN locations l ON pl.location_id = l.id
JOIN locataires laire ON l.locataire_id = laire.id
JOIN chambres c ON l.chambre_id = c.id
JOIN maisons m ON c.maison_id = m.id
ORDER BY trim(upper(m.titre_crm)), c.numero, annee, mois

我想简化它,请问您有什么想法吗?

尝试清理它。请注意,我认为第一个左外部连接可能可以交换为内部连接。

我已经将第二个 UNIONed 查询交换为 2 个查询,对于这些查询,我已将它们更改为使用左外部连接,然后检查是否不匹配

SELECT pl.id, pl.location_id, pl.mois, pl.annee, pl.loyer_paye, 
        l.loyer, l.charges, l.locataire_id, laire.nom, laire.prenom,
       l.chambre_id, c.numero, c.etage, c.maison_id, m.titre_crm 
FROM
(
    SELECT spl.id, spl.location_id, spl.mois, spl.annee, spl.loyer_paye
    FROM locations sl 
    LEFT OUTER JOIN
    (
        SELECT id, location_id, mois, annee, loyer_paye
        FROM paiement_loyer 
        UNION 
        SELECT 9999, usl.id, (MONTH(NOW())-1), YEAR(NOW()), 0
        FROM locations usl 
        LEFT OUTER JOIN paiement_loyer pl1
        ON usl.id = pl1.location_id 
        WHERE pl1.location_id IS NULL
        SELECT 9999, usl.id, (MONTH(NOW())-1), YEAR(NOW()), 0
        FROM locations usl 
        LEFT OUTER JOIN paiement_loyer pl2
        ON usl.id = pl1.location_id 
        AND pl2.annee = YEAR(NOW()) 
        AND pl2.mois=(MONTH(NOW())-1)
        WHERE pl2.location_id IS NULL
    ) spl ON sl.id = spl.location_id
    WHERE CURDATE() BETWEEN sl.date_debut AND sl.date_fin
) pl
JOIN locations l ON pl.location_id = l.id
JOIN locataires laire ON l.locataire_id = laire.id
JOIN chambres c ON l.chambre_id = c.id
JOIN maisons m ON c.maison_id = m.id
ORDER BY TRIM(UPPER(m.titre_crm)), c.numero, pl.annee, pl.mois