-1
votes

La requête MySQL ne fonctionne pas comme prévu (avec des jointures gauche)

Bonjour MySQL et SQL Experts

J'ai un problème avec ma requête.

J'ai 3 tables (comme vous pouvez le voir dans les images ci-dessous)

une table pour l'événement Une table pour le compte d'utilisateur Et une table où la table d'événements et la table de compte d'utilisateur sont liées à (Table Teilnehmer)

Lorsqu'un utilisateur vous inscrit à un événement, l'EFFECT et l'ID utilisateur sera stocké dans la table Teilnmer.

qui fonctionne bien.

Maintenant, le problème est que j'ai créé une requête qui devrait seulement renvoyer les événements, qui sont activés = 1, l'utilisateur ne s'est pas inscrit à la Le nombre de fk_eventid est

mais cela ne fonctionne pas.

Le comte et activé JOI fonctionne, mais bien que l'utilisateur s'inscrit dans un événement, l'événement sera toujours Soyez retourné

Quelqu'un peut-il voir mon problème? xxx

 Entrez l'image Description ici [ Entrez la description de l'image ici ] [ entrez Image Description ici ] 3  Entrez la description de l'image ici


4 commentaires

La plupart des gens ici veulent des données de table d'échantillons et un résultat attendu sous forme de texte formaté, pas comme des images.


Vous collaborez généralement par les mêmes colonnes que vous sélectionnez, à l'exception de ceux qui sont des arguments pour définir des fonctions.


Postez les tables et les données comme texte Lisez ce . Et la plupart des gens ici ne parlent pas allemand


Montrez-nous le schéma DB, les échantillons de données, la sortie actuelle et attendue. Veuillez lire Comment à poser et voici un endroit idéal pour Démarrer pour savoir comment améliorer la qualité de votre question et obtenir de meilleures réponses. Comment créer un exemple minimal, complet et vérifiable essayez de créer un échantillon dans rexester.com


5 Réponses :


0
votes

Vous devez utiliser une jointure extérieure afin d'inclure des événements n'ayant pas d'utilisateur associé sur le côté droit, puis ajoutez la condition que user_id est null.


0 commentaires

0
votes

Vous devez ajouter une condition qui me donne tous ces événements que activé code> mais que l'utilisateur n'est pas inscrit pour cela comme suit. Autoriser également rejoindre code> pour se produire sous sa forme la plus pure, comme décrit ci-dessous.

Vous manquez cette condition dans votre requête p> xxx pré>

La requête complète doit être , p> xxx pré>

Vous ne devez pas le faire, p>

left join Users as u on t.FK_userID=u.ID where v.Enabled=1 and u.ID = 17


4 commentaires

Merci pour votre réponse, mais le problème est que je souhaite montrer tous les événements que l'utilisateur ne vous signera pas. Avec votre requête, cela me montre les événements que l'utilisateur se connecte à


@ Stefanröthlisberger J'ai mis à jour ma réponse. S'il vous plaît essayez la requête mise à jour


Merci de votre aide, mais le problème est toujours le même, cela me montre les événements que l'utilisateur a signé et non les événements que l'utilisateur ne s'est pas inscrit. J'ai téléchargé l'exportation de la DB sur OneDrive, vous pouvez peut-être essayer votre requête et voir pourquoi il ne fonctionne pas 1drv.ms/u/s!AISM5-_HN06SGYQKRBWYWR75OJLAYW


@ Stefanröthlisberger Je pense que vous devez utiliser la sous-requête à la place. J'ai mis à jour ma réponse avec sous-requête et non en opérateur.



0
votes

Je considérerais une sous-requête corrélée au lieu des jointures gauche: xxx


0 commentaires

0
votes

De ce que je peux dire à la requête, vous n'avez pas besoin de référencer la table . Donc, je pense que vous voulez que ce de la clause : xxx

J'écrirais la requête entière comme: xxx


1 commentaires

Merci pour votre requête, mais le problème est que je souhaite montrer tous les événements que l'utilisateur ne s'inscrit pas. Avec cette requête, cela me montre tous les événements (que l'utilisateur s'inscrit à et qui non)



1
votes

Je peux résoudre votre problème.

J'utilise des sous-requêtes pour votre "problème" p>

Utilisez ce code P>

SELECT 
          v.ID, v.NameVeranstaltung, v.Datum, v.Uhrzeit, v.Anzahl, v.Beschreibung, v.Enabled
          FROM
            Veranstaltung as v 
          WHERE 
            v.Enabled=1 and
            not exists
            (
              SELECT 1
              FROM Teilnehmer as t
              WHERE t.FK_eventID=v.ID and t.FK_userID = '$uid'
            )
            and v.Anzahl >
            (
              SELECT count(*)
              FROM Teilnehmer as t
              WHERE t.FK_eventID=v.ID
            );


0 commentaires