MySQL - Duda consulta relación 3 tablas

 
Vista:

Duda consulta relación 3 tablas

Publicado por Mikel (6 intervenciones) el 10/03/2021 11:46:27
Por cada click que hago en una etiqueta, esa etiqueta se guarda en un array, y medianta Ajax le paso ese array con las etiquetas seleccionadas. $etiquetas es el array donde se recogen las seleccionadas.

1
2
3
4
5
6
7
8
$html = '';
$etiquetas = [''];
 
if (isset($_POST['etiquetas'])) {
    $etiquetas = $_POST['etiquetas'];
}
 
$etiquetaFirst = $etiquetas[0]; //esto he añadido para comprobar si funciona con el primero, pero no tengo muy claro como hacer la consulta con mas de una etiqueta. 

En la base de datos tengo tres tablas, una de etiquetas(id, etiquetas), una de archivos(id, archivo) y la otra que relaciona estas dos anteriores, etiquetas_archivos(id, id_etiquetas, id_archivos).

Como puedo conseguir que cada vez que le de una etiqueta, me devuelva las etiquetas asociadas a esa misma?, es decir, con la etiqueta que le paso, me devolveria las etiquetas que tengan el mismo id_archivo que la clicada, ya que varias etiquetas pueden tener el mismo id_archivo.

1
2
3
4
5
$sql = mysqli_query($con,"SELECT * FROM etiquetas (INNER JOIN etiquetas_archivos ON etiquetas.id = etiquetas_archivos.id_etiquetas INNER JOIN archivos ON etiquetas_archivos.id_archivos = archivos.id) WHERE etiqueta='$etiquetaFirst'");
    while ($row = mysqli_fetch_array($sql)) {
        $etiqueta = $row['tag'];
        $html .= '<div class="col-sm-4 inline-block etiqueta" id="etiqueta" name="etiqueta"> <a href="#" >'. $etiqueta .'</a></div>';
    }
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de joel
Val: 650
Plata
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Duda consulta relación 3 tablas

Publicado por joel (231 intervenciones) el 10/03/2021 20:14:53
Hola Mikel, no me queda muy claro el valor de $_POST['etiquetas']... es un array?
De donde sale la variable $etiquetaFirst?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Duda consulta relación 3 tablas

Publicado por Mikel (6 intervenciones) el 10/03/2021 22:20:30
Si, etiquetas es un array. $etiquetaFirst es el primer valor del array.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de joel
Val: 650
Plata
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Duda consulta relación 3 tablas

Publicado por joel (231 intervenciones) el 11/03/2021 07:38:18
Ah, entiendo... entonces si haces un echo de tu consulta SQL algo así:
1
echo "SELECT * FROM etiquetas (INNER JOIN etiquetas_archivos ON etiquetas.id = etiquetas_archivos.id_etiquetas INNER JOIN archivos ON etiquetas_archivos.id_archivos = archivos.id) WHERE etiqueta='$etiquetaFirst'";
Que te devuelve?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Duda consulta relación 3 tablas

Publicado por Mikel (6 intervenciones) el 11/03/2021 11:59:41
La misma etiqueta seleccionada, es decir $etiquetaFirst. Realmente tendria que ser
1
"SELECT * FROM etiquetas INNER JOIN etiquetas_archivos ON etiquetas.id = etiquetas_archivos.id_etiquetas WHERE  .... ;
ya que no necesito datos de la tabla de archivos, pero no se donde meter la etiqueta que yo le paso y donde hacer la comparacion de que tengan el mismo id_archivos.

Teniendo una etiqueta (tabla->etiquetas: etiqueta), quiero que me devuelva todas las etiquetas que tengan el mismo id_archivos que esa etiqueta en la tabla de etiquetas_archivos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Duda consulta relación 3 tablas

Publicado por Mikel (6 intervenciones) el 11/03/2021 13:08:09
Probando en phpmyadmin si pongo asi, "prueba" seria la etiqueta que le paso, $etiquetaFirst:
1
SELECT * FROM `etiquetas` INNER JOIN `etiquetas_archivos` ON `etiquetas_archivos`.`id_etiquetas` =`etiquetas`.`id_etiquetas` WHERE EXISTS (SELECT `id_archivo` FROM `etiquetas_archivos` WHERE `etiquetas`.`etiqueta` = "Prueba")

Me devuelve los archivos de esa etiqueta, lo que me falta seria que devolviera todas las etiquetas que tengan esos archivos que me devuelve.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de joel
Val: 650
Plata
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Duda consulta relación 3 tablas

Publicado por joel (231 intervenciones) el 11/03/2021 15:41:11
Hola Mikel, no te entiendo muy bien... lo que te devuelve son todos los registros que tienen la etiqueta "Prueba"

Cuando dices: Me devuelve los archivos de esa etiqueta, lo que me falta seria que devolviera todas las etiquetas que tengan esos archivos que me devuelve.
Entiendo que la etiqueta de esos archivos es "Prueba", no?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Duda consulta relación 3 tablas

Publicado por Mikel (6 intervenciones) el 11/03/2021 15:57:50
Si la etiqueta de esos archivos es "prueba"
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Duda consulta relación 3 tablas

Publicado por Mikel (6 intervenciones) el 12/03/2021 11:48:10
Se podria hacer esto en una query con inner joins? para hacer a traves de php

1
2
3
4
5
6
7
8
9
10
11
12
WITH etiquetas_archivos_filter AS (
SELECT id_etiqueta,
       GROUP_CONCAT(DISTINCT id_archivo ORDER BY id_archivo) id_archivo
FROM etiquetas_archivos
GROUP BY id_etiqueta
)
SELECT id_etiqueta
FROM etiquetas_archivos_filter t1
WHERE NOT EXISTS ( SELECT NULL
                   FROM etiquetas_archivos_filter t2
                   WHERE t1.id_archivo = t2.id_archivo
                     AND t2. id_etiqueta = '$id_etiqueta' )
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar