0
votes

Comment fusionner deux requêtes Select dans Mysql

J'ai la structure de table ci-dessous dans ma table users où l'utilisateur et le pilote sont enregistrés avec un id unique et séparés par la colonne user_type . les évaluations des utilisateurs sont enregistrées dans la colonne rider_avg_ratings et les évaluations des conducteurs sont enregistrées dans la colonne driver_avg_ratings .

 entrez la description de l'image ici

Lorsqu'un utilisateur soumet une demande, celle-ci est enregistrée dans la table request avec à la fois l'ID utilisateur et l'ID du pilote à proximité. maintenant, je dois renvoyer à la fois les évaluations des pilotes et les évaluations des utilisateurs de la table des utilisateurs dans une seule requête.Le problème est que lorsque je rejoins request.userid = users.id , il renvoie rider_avg_ratings à obtenir le driver_avg_ratings dont j'ai besoin pour rejoindre users.id = request.driver_id comment puis-je obtenir les évaluations des utilisateurs et des conducteurs à partir d'une seule requête

 entrez la description de l'image ici

À partir des deux tables ci-dessus en joignant request.user_id = users.id je dois renvoyer driver_avg_ratings = 4.38 et rider_avg_ratings = 1.25


9 commentaires

Obtenez-vous une erreur?


non, il ne montre aucune erreur seulement une page vierge


Je suis d'accord, avec ysth. Je suppose que vous devriez obtenir une erreur. Il existe certaines contraintes lorsque vous appliquez l'union ou l'union à tous.


non ça ne montre aucune erreur


D'accord. Quelle est l'attente de production? Selon la documentation (exemple donné ci-dessus), les numéros de colonne doivent correspondre et doivent être compatibles. Pouvez-vous vérifier et informer de la sortie attendue?


J'ai des évaluations des pilotes et des utilisateurs dans le même tableau des utilisateurs.En rejoignant la table des utilisateurs avec la table bid_request, je n'obtiens que des évaluations des utilisateurs, mais j'ai besoin à la fois des évaluations des conducteurs et des utilisateurs.J'essaie d'obtenir les évaluations des conducteurs par syndicat


Une requête individuelle renvoie-t-elle les résultats dont vous avez besoin? Pouvez-vous obtenir les en-têtes des résultats individuels et des résultats de l'union ici? Avez-vous vérifié les contraintes de la requête syndicale que j'ai mentionnées ci-dessus?


requête individuelle ne renvoyant pas mes résultats requis mais renvoyant des résultats.Le problème est à la fois le pilote et les évaluations des utilisateurs sont dans la table des utilisateurs.Lorsque je rejoins la table des utilisateurs avec la table bid_request par référence d'ID utilisateur, je n'obtiens pas les évaluations des pilotes plutôt que les évaluations des utilisateurs uniquement mais j'ai besoin des deux . Je pense que ma requête est similaire à votre lien fourni, mais pourquoi afficher un résultat vide ne peut pas comprendre


continuons cette discussion dans le chat .


3 Réponses :


0
votes

Votre requête Union devrait produire une erreur Les instructions SELECT utilisées ont un nombre de colonnes différent . Vous devez comprendre pourquoi votre code ne vérifie pas les erreurs et le faire. De plus, s'il s'agit de l'instruction entière, les parenthèses qui l'entourent n'appartiennent pas.

Vous devez faire en sorte que les deux sélections unies renvoient le même nombre de paramètres. Notez que comme dans les colonnes de sélection de la deuxième sélection sera ignoré et les noms de colonne de résultat proviendront de la première sélection uniquement. Au minimum, pour exécuter la requête, vous devrez ajouter , NULL, NULL, ... à votre deuxième sélection, mais il semble que vous souhaitiez plus d'informations pour être en mesure d'identifier quel utilisateur le driver_avg_ratings est pour, comme l'identifiant, le nom, etc., la première requête est de retour.

Il est souvent utile lors du traitement des résultats d'ajouter quelque chose indiquant de quelle sélection une ligne provient, aussi SELECT "pending_request_users" AS type, ... UNION ALL SELECT "all_users_avg_rating", ... .

Notez que les différents SELECT réunis ensemble renvoient des lignes entières. Si votre seul objectif est d'ajouter des notes de conducteur aux lignes déjà renvoyées, vous ne voulez pas d'union, vous pouvez simplement ajouter:

SELECT ..., driver.driver_avg_ratings
FROM user u
...
INNER JOIN user AS driver ON driver.id=req.driver_id

(ou joindre à gauche si il peut ne pas y avoir de driver_id). Mais il est difficile de dire avec certitude si c'est ce que vous voulez. Fournissez des exemples de données et les résultats souhaités. Dans tous les cas, faites en sorte que votre code détecte correctement les erreurs.


5 commentaires

J'ai essayé d'ajouter Null sur la 2ème instruction de sélection pour correspondre à aucune colonne dans les deux mais ne fonctionne pas. Fondamentalement, j'ai id, driver_avg_ratings, User_avg_ratings et colonne de type dans la table des utilisateurs. dans les types, les utilisateurs sont enregistrés comme utilisateur et les pilotes sont enregistrés en tant que valeur de pilote. dans la table de demande j'ai user_id et driver_id. maintenant, lorsque je rejoins deux tables par user_id, il renvoie user_avg_ratings mais j'ai également besoin de driver_avg_ratings. Pour obtenir driver_avg_ratings, je dois joindre driver_id à partir de la table de requête avec la colonne d'identifiant de la table utilisateur. J'ai joint une image ici avec les deux structures de table imgur.com/a/1lt1vFu


Les images sont difficiles à lire et incomplètes; mieux vaut simplement copier la sortie de show create table yourtablename dans votre question, pour chacune de vos tables. Et encore plus important serait de montrer quelques exemples de données et quels sont vos résultats souhaités


Quels résultats voulez-vous? La requête à la fin de ma réponse est la meilleure supposition que je puisse faire sans voir les exemples de données réels et les résultats souhaités à partir de ces données.


excusez-moi, j'ai à nouveau modifié ma question avec le résultat attendu


Ma requête ne fait-elle pas cela?



0
votes

par exemple: département 1 A 2 B 3 A 4 C 5 B 6 J 7 E 8 F

Vous pouvez faire quelque chose comme

CHOISIR 1 AS deptnumber , Département FROM tbl_students WHERE Dept IN ('A', 'B', 'C') SYNDICAT SÉLECTIONNER 2 AS DeptNumber , Département FROM tbl_students WHERE Dept IN ('D', 'E') SYNDICAT SÉLECTIONNER 3 AS Numéro de service , Département FROM tbl_students WHERE Dept IN ('F')


1 commentaires

cela me semble très déroutant. pouvez-vous modifier votre réponse en fonction de mon tableau et de ma colonne fournis



1
votes
SELECT r.user_id as userId, u.rider_avg_ratings as ratings 
FROM user as u 
INNER JOIN request as r on u.id = r.user_id 

UNION 

SELECT r1.driver_id as userId, u1.driver_avg_ratings as ratings 
FROM user as u1 
INNER JOIN request as r1 on u1.id = r1.driver_id
This query will fetch the desired result.

1 commentaires

Merci pour ses résultats. Si je veux utiliser une instruction where, est-ce qu'elle doit être incluse dans les deux instructions