MySQL effectue une jointure à gauche en fonction d'une condition

raven_977:

Je souhaite créer une jointure à gauche en fonction du champ 'destinataireType' dans la table principale. J'ai un destinataire de type «0» qui indique que c'est un client et un destinataire de type «1», ce qui signifie que c'est un collègue. Selon le type «0» ou «1», je dois créer différentes jointures à gauche pour sélectionner les noms de différentes tables.

Voici mon exemple de code, qui ne fonctionne pas, mais qui montre peut-être ce que je veux.

SELECT wm.*, wmc.name AS categoryName, wmbt.title AS templateTitle, u.firstName, u.lastName FROM word_module_final_doc AS wm 
LEFT JOIN word_module_categorys AS wmc ON wmc.id = wm.categoryId 
LEFT JOIN word_module_basic_templates AS wmbt ON wmbt.id = wm.templateId 
LEFT JOIN user AS u ON u.emailAdress = wm.createdBy 
CASE wm.recipientType WHEN '0' 
THEN 
LEFT JOIN customer AS c ON c.customerId = recipientId
END
WHERE wm.createdBy = @createdBy AND wm.deleted = '0' ORDER by id DESC

Y a-t-il un moyen de faire fonctionner cela?

J'espère que vous comprenez ce que je veux dire parce que l'anglais n'est pas ma langue maternelle.

Merci d'avance :-)

Bill Karwin:

Non, vous ne pouvez pas mettre de jointures dans des conditions comme vous le décrivez. SQL n'a pas de syntaxe ou de sémantique pour joindre «sous condition». Les jointures doivent être corrigées avant que la requête ne commence à lire les données, il n'y a donc aucun moyen que les valeurs de données puissent modifier les tables impliquées.

Mais vous pouvez accomplir la logique dont vous avez besoin en vous joignant aux deux et en incluant le terme receiverType dans la condition de jointure.

SELECT wm.*, wmc.name AS categoryName, wmbt.title AS templateTitle, u.firstName, u.lastName,
  COALESCE(c1.something, c2.something) AS `something`
FROM word_module_final_doc AS wm
LEFT JOIN word_module_categorys AS wmc ON wmc.id = wm.categoryId
LEFT JOIN word_module_basic_templates AS wmbt ON wmbt.id = wm.templateId
LEFT JOIN user AS u ON u.emailAdress = wm.createdBy
LEFT JOIN customer AS c1 ON c1.customerId = wm.recipientId AND wm.recipientType = '0'
LEFT JOIN coworker AS c2 ON c2.customerId = wm.recipientId AND wm.recipientType = '1'
WHERE wm.createdBy = @createdBy AND wm.deleted = '0' ORDER by id DESC

Logiquement, cela wm.recipientIdpeut être 0 ou 1 mais pas les deux en même temps. Ainsi, un seul de ces LEFT JOINs peut retourner une valeur, et l'autre renverra NULL.

S'il existe une colonne commune somethingaux tables client et collègue, vous pouvez l'inclure dans votre liste de sélection en utilisant COALESCE()comme je l'ai montré. Le premier argument non NULL de COALESCE()est le résultat de cette fonction.

Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.

En cas d'infraction, veuillez [email protected] Supprimer.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

TOP liste

  1. 1

    Comment désactiver ou activer le balayage de Viewpager dans Android

  2. 2

    Créer une table externe Hive à partir de fichiers de parquet partitionnés dans Azure HDInsights

  3. 3

    Comment changer le navigateur par défaut en Microsoft Edge pour Jupyter Notebook sous Windows 10 ?

  4. 4

    Enregistrer le chemin de l'image de la galerie vers la base de données de la salle et l'afficher dans la liste des recycleurs

  5. 5

    Concaténer des variables dans ansible

  6. 6

    ESP8266 HADRWARE MINUTERIE, USA pour cocher une macro étrange

  7. 7

    Stop jQuery execution after one time execution

  8. 8

    Filtrer les données en fonction des conditions d'une trame de données

  9. 9

    Comment analyser un fichier avec un tableau d'objets JSON en utilisant Node.js?

  10. 10

    obtenir le nombre de marqueur affiché sur la carte

  11. 11

    Comment centrer un div tout en utilisant la transition et transformer avec l'échelle

  12. 12

    Comment utiliser le stockage local et le supprimer lorsqu'il n'est pas nécessaire

  13. 13

    Redirection HTTP vers HTTPS dans Java à l'aide de HTTPURLConnection

  14. 14

    Comment envoyer plusieurs variables de la lame au contrôleur

  15. 15

    Comment définir du texte dans un QLabel et afficher les caractères '<>'?

  16. 16

    Échec de l'exécution de 'insertBefore' sur 'Node': le paramètre 1 n'est pas de type 'Node'

  17. 17

    System.Data.SqlClient.SqlException: 'Nom de colonne non valide' ApplicationRoleId '.'

  18. 18

    Générer une variable binaire avec une corrélation prédéfinie avec une variable déjà existante

  19. 19

    la mise en place Spring dans Eclipse - Échec d'initialisation de contexte

  20. 20

    comment afficher un bouton au-dessus d'un autre élément ?

  21. 21

    Uncaught TypeError: map n'est pas une fonction dans Reactjs avec Firebase

chaudétiquette

Archive