/ / Mon sql récupère les données de plusieurs tables, séparées par des virgules - mysql, optimisation de requête, jointure interne, jeu de résultats

Mon SQL obtenir des données de plusieurs tables, séparés par des virgules - mysql, optimisation de la requête, jointure interne, jeu de résultats

J'ai 3 tables comme suit Médecins

CREATE TABLE `doctors` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`first_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`last_name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`phone_number` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`avatar_path` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`qualification` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`status` tinyint(4) NOT NULL DEFAULT "0",
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
`deleted_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `doctors_email_unique` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

Spécialisations

CREATE TABLE `specializations` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`status` tinyint(4) NOT NULL DEFAULT "0",
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
`deleted_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=105 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

et plusieurs à plusieurs de ces 2 tables

CREATE TABLE `doctor_specialization` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`doctor_id` int(10) unsigned NOT NULL,
`specialization_id` int(10) unsigned NOT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
`deleted_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `doctor_specialization_doctor_id_foreign` (`doctor_id`),
KEY `doctor_specialization_specialization_id_foreign` (`specialization_id`),
CONSTRAINT `doctor_specialization_doctor_id_foreign` FOREIGN KEY (`doctor_id`) REFERENCES `doctors` (`id`),
CONSTRAINT `doctor_specialization_specialization_id_foreign` FOREIGN KEY (`specialization_id`) REFERENCES `specializations` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

Maintenant, je veux que la requête obtienne les résultats de docteur avec les spécialisations séparées par une virgule si plus de 1.

Y a-t-il un moyen d'y parvenir de façon mysql? Ou je devrai faire php loops sur chaque jeu de résultats?

Réponses:

0 pour la réponse № 1

Vous pouvez utiliser la fonction intégrée MySQL - GROUP_CONCAT

SELECT  d.first_name,
d.last_name,
GROUP_CONCAT(s.name) AS `specializations`
FROM    doctors d
INNER JOIN doctor_specialization ds
ON d.id = ds.doctor_id
INNER JOIN specializations s
ON ds.specialization_id = s.id
GROUP   BY d.first_name, d.last_name

0 pour la réponse № 2

- vous devriez utiliser quelque chose comme INNER JOIN

SELECT column_name(s)
FROM table1
INNER JOIN table2 ON table1.column_name = table2.column_name;

ok maintenant nous allons utiliser cette syntaxe:

SELECT *
FROM doctors
INNER JOIN doctor_specialization ON doctors.id = doctor_specialization.doctor_id;

vous pouvez en utiliser plusieurs si vous avez besoin d'une jointure interne pour une déclaration. c'est à dire.

SELECT *
FROM doctors
INNER JOIN doctor_specialization ON doctors.id = doctor_specialization.doctor_id
INNER JOIN doctor_address ON doctors.id = doctor_address.doctor_id;