récupération et jointure

MySQL

a marqué ce sujet comme résolu.

Bonjour tout le monde,

Pour le compte d’un projet web côté back-end, nous utilisons le PHP 7.4 et MySQL 8.X, voici la structure d’une partie de la BDD

CREATE TABLE `disponibilite` (
  `id` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `categorie_id` int DEFAULT NULL,
  `etudiant_id` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `jour` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `heure` int DEFAULT NULL,
  `minute` int DEFAULT NULL,
  `debut` date DEFAULT NULL,
  `fin` date DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `IDX_2CBACE2FBCF5E72D` (`categorie_id`),
  KEY `IDX_2CBACE2FDDEAB1A3` (`etudiant_id`),
  CONSTRAINT `FK_2CBACE2FBCF5E72D` FOREIGN KEY (`categorie_id`) REFERENCES `categorie_disponibilite` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT `FK_2CBACE2FDDEAB1A3` FOREIGN KEY (`etudiant_id`) REFERENCES `etudiant` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
CREATE TABLE `categorie_disponibilite` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
CREATE TABLE `etudiant` (
  `id` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `sexe_id` int DEFAULT NULL,
  `ville_id` int DEFAULT NULL,
  `obtention_bac_id` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `nom` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `prenom` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `telephone` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `date_naissance` date DEFAULT NULL,
  `mdp` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `photo` longtext COLLATE utf8mb4_unicode_ci,
  `cv` longtext COLLATE utf8mb4_unicode_ci,
  `formation_id` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `universite_id` int DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `IDX_717E22E3448F3B3C` (`sexe_id`),
  KEY `IDX_717E22E3A73F0036` (`ville_id`),
  KEY `IDX_717E22E331066095` (`obtention_bac_id`),
  KEY `IDX_717E22E35200282E` (`formation_id`),
  KEY `IDX_717E22E32A52F05F` (`universite_id`) /*!80000 INVISIBLE */,
  KEY `FK_717E22E32A52F05F_idx` (`universite_id`),
  KEY `IDX_717E22E32A52F05F_idx` (`universite_id`),
  CONSTRAINT `FK_717E22E32A52F05F` FOREIGN KEY (`universite_id`) REFERENCES `universite` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT `FK_717E22E331066095` FOREIGN KEY (`obtention_bac_id`) REFERENCES `otention_bac` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT `FK_717E22E3448F3B3C` FOREIGN KEY (`sexe_id`) REFERENCES `sexe` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT `FK_717E22E35200282E` FOREIGN KEY (`formation_id`) REFERENCES `formation` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT `FK_717E22E3A73F0036` FOREIGN KEY (`ville_id`) REFERENCES `ville` (`id`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
CREATE TABLE `demande` (
  `id` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `etudiant_id` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `date` datetime NOT NULL,
  `titre` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `contenu` longtext COLLATE utf8mb4_unicode_ci NOT NULL,
  `ville_id` int DEFAULT NULL,
  `type_job_id` int DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `IDX_2694D7A5DDEAB1A3` (`etudiant_id`),
  KEY `demande_ville_idx` (`ville_id`),
  KEY `demande_type_job_idx` (`type_job_id`),
  CONSTRAINT `demande_type_job` FOREIGN KEY (`type_job_id`) REFERENCES `type_job` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT `demande_ville` FOREIGN KEY (`ville_id`) REFERENCES `ville` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT `FK_2694D7A5DDEAB1A3` FOREIGN KEY (`etudiant_id`) REFERENCES `etudiant` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

Voici les cardinalités:

  • un ETUDIANT peut avoir plusieurs disponibilités (peut importe la catégorie de la disponibilite)
  • une DISPONIBILITE peut appartenir à un ou plusieurs ETUDIANT
  • un étudiant peut avoir une ou plusieurs DEMANDE
  • une DEMANDE appartient à un seul ETUDIANT

mais lors que j’essaie de récupérer toutes les DEMANDES en fonction d’une période, cela mes récupère les données doublements:

SELECT DE.*, ET.photo AS photo_editeur, CONCAT(ET.prenom, ' ', ET.nom) AS nom_editeur, DI.debut, DI.fin
FROM demande DE
INNER JOIN etudiant ET ON ET.id = DE.etudiant_id
INNER JOIN disponibilite DI ON DI.etudiant_id = DE.etudiant_id
WHERE DI.debut < CAST('2022-12-31' AS DATETIME) AND DI.fin > CAST('2022-09-11' AS DATETIME) AND DI.categorie_id=2

Note: Pouvez-vous m’aider car je veux récupérer les données en fonction de la disponibilité de l’étudiant

Avance étape par étape.

SELECT DE.*, ET.photo AS photo_editeur, CONCAT(ET.prenom, ' ', ET.nom) AS nom_editeur
FROM demande DE
INNER JOIN etudiant ET ON ET.id = DE.etudiant_id

Est-ce que cette requête renvoie quelque chose de cohérent.

Et si c’est cohérent à ce niveau, c’est la jointure avec disponibilite qui pose problème.

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte