Hola de nuevo Vanessa:
Vamos por partes:
Esto es correcto, este tipo de modelos es la base del modelo Entidad-Relación en base de datos, por un lado tienes tablas CATALOGOS con la información "principal" sin duplicados, (es decir, con esto automáticamente solucionarías tu problema original), la tercer tabla es una tabla de RELACIONES y como su nombre lo indica, guarda los registros de cómo se relacionan las tablas catalogos... con los datos de ejemplo, observa detenidamente la tabla de relaciones para el caso del Dr. DONALD, (id_doctor = 4);
Observa que para cada especialidad que tiene, SE AGREGA UN REGISTRO A LA TABLA... y aquí no hay límite, si un DR, tuviera 15 especialidades, entonces en la tabla de relaciones habría 15 REGISTROS (¿se entiende?). Para ampliar este tema podrías leer algún manual de Diseño de BD's o del Modelo Entidad-Relación.
Ahora bien, pasando a la solución, creo que te estás confundiendo con los nombres de los objetos y los ALIAS que estoy manejando... es posible que solo hayas copiado y pegado la solución sin observar realmente qué hacía cada cosa... además tienes un error de "dedo", ya que en tu consulta, estás poniendo tu tabla como
especilaidad que no es lo mismo que
especialidad.
Para empezar, en mi ejemplo la tabla se llama ESPECIALIDADES (es una buena práctica manejar los nombres de tablas en plural) y lo que hago es intenta es "simular" el primer modelo, es decir, crear un CATALOGO DE ESPECIALIDADES a partir de la información de las tres tablas:
Observa esto:
Lo se hace con el UNION es crear una tabla "virtual" con una sola columna, que contenga la información de las tres columnas de tu tabla:
El alias en realidad no es "importante" pero si es significativo, cuando haces un UNION, si los nombres de los campos NO SON IGUALES, por defecto asigna el nombre del primer UNION a la tabla resultante, observa en este ejemplo que la columna resultante tiene el nombre de ESP1
En mi ejemplo hago esto:
lo único que hago es crear un ALIAS para cambiar el nombre de ESP1 a especialidad, lo mismo pasa con ESP2 y ESP3, es decir "estandarizo" un mismo nombre para los tres campos, sea que uses alias o no, debes tener en cuenta el nombre del campo para la siguiente parte:
Una vez que tienes esta tabla "virtual" lo que haces es seleccionar los registros DISTINTOS, mediante una subconsulta:
MUCHO OJO: observa que después del paréntesis que cierra la subconsulta pongo una T, esto es también UN ALIAS para la tabla resultante, puedes poner el alias que quieras, pero debes ponerlo, (en tu ejemplo no pones este alias)
entonces, tu consulta CON TUS NOMBRES podría quedar así:
Observa que en el SELECT externo PONGO EL ALIAS QUE LE ESTOY ASIGNANDO AL CAMPO EN LOS UNION'S (en este campo
"alias_campo") y observa que al después del paréntesis le asigno un ALIAS A LA TABLA RESULTANTE (en este caso
"alias_tabla")
Finalmente, como recomendación, cuando ejecutes alguna consulta así, hazlo directamente desde una consola de MySQL o desde el Workbench, para que sepas qué errores de SQL tiene la consulta y nos los confundas con errores de PHP o de cualquier lenguaje con el que estés programando.
Haz la prueba y nos comentas.
Saludos