MySQL - Consulta a cuatro tablas, datos cuadruplicados

 
Vista:
Imágen de perfil de Gabriel
Val: 7
Ha aumentado su posición en 3 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

Consulta a cuatro tablas, datos cuadruplicados

Publicado por Gabriel (4 intervenciones) el 21/03/2019 16:59:22
Hola a todos, tengo un problema al mostrar los resultados de mi consulta, yo realizo la consulta a las tablas y me muestra toda la info que necesito, pero me lo muestra 4 veces. dejo mi codigo, par ver si lguien puede ayudarme, nose si estoy haciendo algo mal...


****** AQUI DEJO LA ESTRUCTURAS DE LAS TABLAS ******


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
Estructura de tabla para la tabla `causa`
--
 
CREATE TABLE `causa` (
  `id_causa` int(40) NOT NULL,
  `caratula` varchar(40) CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL,
  `expediente` varchar(40) CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL,
  `lugar` varchar(40) CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL,
  `fecha` varchar(40) CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL,
  `autoridad` varchar(40) CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
-- --------------------------------------------------------
 
--
-- Estructura de tabla para la tabla `imagenes`
--
 
CREATE TABLE `imagenes` (
  `id_fotos` int(40) NOT NULL,
  `frente` varchar(255) COLLATE utf8_spanish_ci NOT NULL,
  `perfil` varchar(255) COLLATE utf8_spanish_ci NOT NULL,
  `cuerpo` varchar(255) COLLATE utf8_spanish_ci NOT NULL,
  `anexo1` varchar(255) COLLATE utf8_spanish_ci NOT NULL,
  `anexo2` varchar(255) COLLATE utf8_spanish_ci NOT NULL,
  `anexo3` varchar(255) COLLATE utf8_spanish_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;
 
-- --------------------------------------------------------
 
--
-- Estructura de tabla para la tabla `rasgos`
--
 
CREATE TABLE `rasgos` (
  `id_morfo` int(40) NOT NULL,
  `altura` varchar(23) CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL,
  `complexion` varchar(32) CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL,
  `piel` varchar(23) CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL,
  `obs` varchar(60) CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL,
  `cabello` varchar(40) CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL,
  `tatuajes` varchar(32) CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
-- --------------------------------------------------------
 
--
-- Estructura de tabla para la tabla `recorrido`
--
 
CREATE TABLE `recorrido` (
  `id_recorrido` int(40) NOT NULL,
  `ficha` int(15) NOT NULL,
  `nombre` varchar(40) CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL,
  `dni` varchar(40) CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL,
  `domicilio` varchar(45) CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL,
  `natalicio` date NOT NULL,
  `lugarNac` varchar(40) CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL,
  `provincia` varchar(40) CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL,
  `apodo` varchar(40) CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL,
  `sexo` varchar(40) CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL,
  `estado` varchar(40) CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL,
  `modalidad` varchar(40) CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL,
  `ocupacion` varchar(40) CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL,
  `estudio` varchar(40) CHARACTER SET utf8 COLLATE utf8_spanish_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
--
-- Índices para tablas volcadas
--
 
--
-- Indices de la tabla `causa`
--
ALTER TABLE `causa`
  ADD PRIMARY KEY (`id_causa`);
 
--
-- Indices de la tabla `imagenes`
--
ALTER TABLE `imagenes`
  ADD PRIMARY KEY (`id_fotos`);
 
--
-- Indices de la tabla `rasgos`
--
ALTER TABLE `rasgos`
  ADD PRIMARY KEY (`id_morfo`);
 
--
-- Indices de la tabla `recorrido`
--
ALTER TABLE `recorrido`
  ADD PRIMARY KEY (`id_recorrido`);
 
--
-- AUTO_INCREMENT de las tablas volcadas
--
 
--
-- AUTO_INCREMENT de la tabla `causa`
--
ALTER TABLE `causa`
  MODIFY `id_causa` int(40) NOT NULL AUTO_INCREMENT;
 
--
-- AUTO_INCREMENT de la tabla `imagenes`
--
ALTER TABLE `imagenes`
  MODIFY `id_fotos` int(40) NOT NULL AUTO_INCREMENT;
 
--
-- AUTO_INCREMENT de la tabla `rasgos`
--
ALTER TABLE `rasgos`
  MODIFY `id_morfo` int(40) NOT NULL AUTO_INCREMENT;
 
--
-- AUTO_INCREMENT de la tabla `recorrido`
--
ALTER TABLE `recorrido`
  MODIFY `id_recorrido` int(40) NOT NULL AUTO_INCREMENT;
COMMIT;

****** AQUI DEJO LA CONSULTA QUE REALIZO *****


$sql = "SELECT * FROM causa INNER JOIN rasgos INNER JOIN recorrido INNER JOIN imagenes";

$resultado = mysqli_query($ConDB, $sql);
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

Consulta a cuatro tablas, datos cuadruplicados

Publicado por leonardo_josue (414 intervenciones) el 21/03/2019 21:30:50
Hola Gabriel:

Estás omitiendo la cláusula ON en tus JOINS, es decir, no estás diciendo cómo están relacionadas cada una de tus tablas y por lo tanto se realiza un PRODUCTO CARTESIANO entre ellas. Checa este ejemplo, con dos tablas simples:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mysql> SELECT * FROM tabla_a;
+------+-------------+
| id   | descripcion |
+------+-------------+
|    1 | uno         |
|    2 | dos         |
|    3 | tres        |
+------+-------------+
3 rows in set (0.05 sec)
 
mysql> SELECT * FROM tabla_b;
+------+-------------+
| id   | descripcion |
+------+-------------+
|    1 | one         |
|    2 | two         |
|    3 | three       |
+------+-------------+
3 rows in set (0.00 sec)

Tal como lo tienes, pasa esto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> SELECT * FROM tabla_a
    -> INNER JOIN tabla_b;
+------+-------------+------+-------------+
| id   | descripcion | id   | descripcion |
+------+-------------+------+-------------+
|    1 | uno         |    1 | one         |
|    2 | dos         |    1 | one         |
|    3 | tres        |    1 | one         |
|    1 | uno         |    2 | two         |
|    2 | dos         |    2 | two         |
|    3 | tres        |    2 | two         |
|    1 | uno         |    3 | three       |
|    2 | dos         |    3 | three       |
|    3 | tres        |    3 | three       |
+------+-------------+------+-------------+
9 rows in set (0.00 sec)

Esto es un PRODUCTO CARTESIANO, es decir, cada elemento de la tabla_a se UNE con cada elemento de la tabla_B. Entonces, lo que tienes que hacer es incluir en cláusula ON cómo es que están relacionadas ambas tablas, es decir, algo así:

1
2
3
4
5
6
7
8
9
10
mysql> SELECT * FROM tabla_a
    -> INNER JOIN tabla_b ON tabla_a.id = tabla_b.id;
+------+-------------+------+-------------+
| id   | descripcion | id   | descripcion |
+------+-------------+------+-------------+
|    1 | uno         |    1 | one         |
|    2 | dos         |    2 | two         |
|    3 | tres        |    3 | three       |
+------+-------------+------+-------------+
3 rows in set (0.28 sec)

¿Se entiende?

Haz la prueba y nos comentas.

Saludos
Leo.
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 Gabriel
Val: 7
Ha aumentado su posición en 3 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

Consulta a cuatro tablas, datos cuadruplicados

Publicado por Gabriel (4 intervenciones) el 23/03/2019 12:17:31
Hola leonardo_josue Gracias por tu respuesta.

Lo había probado de esa manera pero me d este error:

Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in C:\xampp\htdocs\recorrrido\index3.php on line 24

En esa linea tengo un while que captura los resultados..

Probe de dos maneras:

1ra

1
2
3
4
5
//Cadena SQL.
$sql = "SELECT * FROM recorrido a INNER JOIN rasgos b INNER JOIN causa c INNER JOIN imagenes d ON a.id_recorrido = b.id_morfo ON a.id_recorrido";
 
//Query página.
$resultado = mysqli_query($ConDB, $sql);


2da

1
2
3
4
5
//Cadena SQL.
$sql = "SELECT * FROM recorrido a INNER JOIN rasgos b INNER JOIN causa c INNER JOIN imagenes d ON a.id_recorrido = b.id_morfo ON a.id_recorrido = c.id_causa ON a.id_recorrido = d.id_fotos";
 
//Query página.
$resultado = mysqli_query($ConDB, $sql);
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

Consulta a cuatro tablas, datos cuadruplicados

Publicado por leonardo_josue (414 intervenciones) el 25/03/2019 22:30:28
Hola de nuevo Gabriel:

Creo que no pusiste atención al ejemplo que te puse y si pusiste atención entonces te valieron para dos cosas mis recomentaciones. Vayamos por partes: el error que pones es de PHP que nada tiene que ver con MySQL, así es que ojo con eso. Cualquier código de cualquier lenguaje de programación está de más en este foro, así es que en el futuro trata de postear solo SQL puro. En este caso, si tomas tu consulta y la ejecutas en Workbench o directamente en la consulta de MySQL, te darías cuentas que tienes varios HORRORES de sintaxis (si, horrores, no errores).

1
2
3
4
5
SELECT *
FROM recorrido a
INNER JOIN rasgos b
INNER JOIN causa c
INNER JOIN imagenes d ON a.id_recorrido = b.id_morfo ON a.id_recorrido

Dándole un poco de orden a tu consulta te repito que CADA INNER JOIN debe tener su propia cláusula ON... tal como lo tienes, sólo el último JOIN tiene cláusula ON, pero tienes otro HORROR, ya que estás poniéndole DOS CLAUSULAS ON.

lo mismo pasa con la segunda consulta:

1
2
3
4
5
SELECT *
FROM recorrido a
INNER JOIN rasgos b
INNER JOIN causa c
INNER JOIN imagenes d ON a.id_recorrido = b.id_morfo ON a.id_recorrido = c.id_causa ON a.id_recorrido = d.id_fotos.

Todas las cláusulas ON SE APLICAN PARA EL ULTIMO JOIN, por lo tanto ESTO ES UN HORROR DE SINTAXIS:

En mi post y en mi ejemplo insisto CADA INNER JOIN DEBE TENER SU PROPIA CLÁUSULA ON, entonces, haciendo tu trabajo, la consulta debería quedar más o menos así.

1
2
3
4
5
SELECT *
FROM recorrido a
INNER JOIN rasgos b ON a.id_recorrido = b.id_morfo
INNER JOIN causa c  ON a.id_recorrido = c.id_causa
INNER JOIN imagenes d  ON a.id_recorrido = d.id_fotos

Notas la diferencia?

ejecuta esta consulta directamente en una consola de MySQL y si hay algún error dinos cuál es.

Finalmente, es una terrible práctica usar un SELECT *, ya que esto te trae todos los campos de todas las tablas, cuando en la realidad es muy dificil que tengas necesidad de usar todos los campos. Luego entonces, LISTAS SÓLO AQUELLOS CAMPOS QUE REALMENTE NECESITAS.

1
SELECT tabla1.campo1, tabla2.campo2, tabla3.campo1 .......

Haz la prueba y nos comentas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Gabriel
Val: 7
Ha aumentado su posición en 3 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

Consulta a cuatro tablas, datos cuadruplicados

Publicado por Gabriel (4 intervenciones) el 25/03/2019 23:24:43
Hola leonardo_josue Gracias por tu respuesta.

Primeramente te pido mil disculpas, no me había dado cuenta de mi horror. Me pidieron que saque este sistema en dos días y por la presión no me di cuenta.

Lo probé como dices y funciona perfecto.

Sobre lo que me dices de los campos, el analista que trabaja conmigo creo las db así por su sistema de estadísticas y en la plataforma que tengo debo mostrar todos los campos si o si. Por lo menos eso es lo que me pidieron.

Desde ya muy agradecido por tu respuesta y por haberme explicado mi horror, tendré mas cuidado la próxima.
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