MySQL离开了加入和ORDER

时间:2013-03-27 01:06:08

标签: mysql sql join left-join

我遇到了mySQL查询的问题。

我想从credit_memo表中的每个HISTORIQUE_DEVISE最后一次汇率返回。

HISTORIQUE_DEVISE表的记录如下:

ID  |  account_id|  code_source  |  code_destination |  date      |   taux     | ..
242 |         12 |             1 |               133 | 2013-02-22 |    0.82000 | ..
243 |         12 |             1 |               133 | 2013-03-26 |    0.96000 | ..
244 |         12 |             1 |               133 | 2013-03-26 |    1.29000 | ..

目前,我的最后一个左连接返回3行(如果credit_memo.date等于2013-03-26并且SELECT中的rate.taux返回0.82000。 如何转换查询以获取{左}加入的最后一个值1.29000?因为我只想要最后一条记录#244。 是否可以避免左连接内的子查询?

感谢您的帮助!

SELECT credit_memo.code_avoir_client, 
       credit_memo.total_ttc, 
       credit_memo.date, 
       credit_memo.code_utilisateur, 
       credit_memo.montant_restant_a_payer, 
       DEVISE.code_iso, 
       PAIEMENT_FACTURE_FOURNISSEUR.date_reglement, 
       customer.code_client, 
       customer.code_utilisateur_client, 
       customer.prenom, 
       customer.raison_social, 
       lead.code_client, 
       lead.code_utilisateur_client, 
       lead.prenom, 
       lead.raison_social, 
       project.project_code, 
       project.name,  
       rate.taux
FROM AVOIR_CLIENT AS credit_memo
       LEFT JOIN CLIENT AS customer 
              ON customer.code_client = credit_memo.code_client 
                 AND customer.code_profil_client = 1 
                 AND ( customer.account_id = 0 
                        OR customer.account_id = 12 ) 
                 AND customer.etat = 0 
       LEFT JOIN CLIENT AS lead 
              ON lead.code_client = credit_memo.code_client 
                 AND lead.code_profil_client = 2 
                 AND ( lead.account_id = 0 
                        OR lead.account_id = 12 ) 
                 AND lead.etat = 0 
       LEFT JOIN PROJECT AS project 
              ON project.project_code = credit_memo.project_code 
                 AND ( project.account_id = 0 
                        OR project.account_id = 12 ) 
                 AND project.etat = 0 
       LEFT JOIN DEVISE 
              ON DEVISE.code_devise = credit_memo.code_devise 
                 AND ( DEVISE.account_id = 0 
                        OR DEVISE.account_id = 12 ) 
                 AND DEVISE.etat = 0 
       LEFT JOIN PAIEMENT_FACTURE_FOURNISSEUR 
              ON PAIEMENT_FACTURE_FOURNISSEUR.code_avoir_client = 
                 credit_memo.code_avoir_client 
                 AND ( PAIEMENT_FACTURE_FOURNISSEUR.account_id = 0 
                        OR PAIEMENT_FACTURE_FOURNISSEUR.account_id = 12 ) 
                 AND PAIEMENT_FACTURE_FOURNISSEUR.etat = 0
       LEFT JOIN ETABLISSEMENT AS eta
              ON eta.code_etablissement = 
                 credit_memo.code_etablissement 
                 AND ( eta.account_id = 0 
                        OR eta.account_id = 12 )
       LEFT JOIN HISTORIQUE_DEVISE AS rate
              ON rate.code_etablissement = 
                 credit_memo.code_etablissement 
                 AND rate.CODE_DEVISE_SOURCE = credit_memo.CODE_DEVISE
                 AND rate.CODE_DEVISE_DESTINATION = eta.CODE_DEVISE
                 AND rate.date <= credit_memo.date
                 AND ( rate.account_id = 0 
                        OR rate.account_id = 12 )
                 AND rate.etat = 0
WHERE  ( credit_memo.account_id = 0 
          OR credit_memo.account_id = 12 ) 
       AND credit_memo.etat = 0 
GROUP BY credit_memo.code_avoir_client ;

1 个答案:

答案 0 :(得分:0)

您可以通过添加过滤掉它们的where子句来消除其他行。你的SQL在没有更多知识的情况下对我来说有点复杂,但通常where子句会是这样的:

AND NOT EXISTS 
(Select * 
 From HISTORIQUE_DEVISE rate_2 
 WHERE rate.accoun_id=rate_2.accountid 
    ... add other keys fields here if they need to be equal ...
   AND rate_2.ID > rate.ID
)

换句话说,请忽略您在HISTORIQUE_DEVISE中找到“匹配记录”的记录,但ID更高