2010-07-23 8 views
1

Selon https://stackoverflow.com/questions/3264227/relations-with-multiple-keys-in-doctrine-1-2, j'ai deux tables qui (comme je ne peux pas le faire fonctionner dans Doctrine) J'essaie de rejoindre en tant que vue MySQL:Création d'une jointure externe gauche dans MySQL avec des contraintes de droite

partie:

  • part_id
  • product_ID
  • part_type_id
  • part_short_code
  • ...

part_translation:

  • part_type_id
  • part_short_code
  • LANGUAGE_ID
  • internationalised_name
  • ...

sur la contrainte que part_type_id et part_short _code doit correspondre entre les tables.

Ceci est compliqué par le fait que:

  • Le tableau de droite (part_translation) ne peut pas avoir une ligne correspondante (d'où la jointure gauche)
  • Le tableau de droite est uniquement valable pour rejoindre quand part_short_code = '' et language_id = 1

J'ai une question de travail:

SELECT * de la partie LEFT OUTER JOIN (SELECT * FROM part_translation OÙ language_id = 1 ET part_short_code! = '') Comme part_data_uk UTILISATION (part_type_id, part_short_code)

mais a) il est lent (probablement en raison de la sous-requête) et b) Je ne peux pas tourner "# 1349 - SELECT de View contient une sous-requête dans la clause FROM"

Je ne trouve pas comment ajouter les contraintes à la table de droite sans que la jointure agisse comme une jointure interne et compétences toutes les lignes où le côté droit est nul.

Quelqu'un peut-il me dire comment optimiser/améliorer cette requête de manière à se débarrasser de la sous-requête et à la rendre utilisable dans une vue?

Utilisation de MySQL 5.0.45, FWIW.

Merci, Richard

Répondre

3

Vous pouvez mettre quoi que ce soit à peu près dans la partie ON e. Ne sera pas un joli spectacle, mais il peut fonctionner:

SELECT * FROM `part` `p` LEFT JOIN `part_translation` `t` ON (
    `p`.`part_type_id` = `t`.`part_type_id` 
    AND `p`.`part_short_code` = `t`.`part_short_code` 
    AND `t`.`part_short_code` != "" 
    AND `t`.`language_id` = 1 
) 
+0

Je sais que je ne jure pas que la dernière fois que j'ai essayé ... doit avoir mal saisi. Merci! – Parsingphase