MySQL - Duda con consulta

 
Vista:

Duda con consulta

Publicado por Javi (3 intervenciones) el 06/04/2016 11:40:37
Buenas a todos y un millón de gracias por anticipado.

Me ha surgido la necesidad de hacer una búsqueda para una web de coches y no termino de dar con la consulta correctamente.

Os presento una pequeña recreación de la base de datos (la infomación justa).
NO añado la tabla extras porque no me influye en lo que necesito. Las tres tablas forman parte de una relación N:M de las tablas coches y extras(techo solar, climatizador bizona, etc)

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
CREATE TABLE IF NOT EXISTS `coches` (
  `id` int(11) NOT NULL,
  `nombre` varchar(100) NOT NULL
);
 
INSERT INTO `coches` (`id`, `nombre`) VALUES
(1, 'Ford Focus'),
(2, 'Nissan Micra'),
(3, 'skoda fabia'),
(4, 'renault twingo');
 
CREATE TABLE IF NOT EXISTS `extras_coches` (
  `id_coche` int(11) NOT NULL,
  `id_extra` int(11) NOT NULL
);
 
INSERT INTO `extras_coches` (`id_coche`, `id_extra`) VALUES
(1, 1),
(1, 4),
(2, 2),
(2, 4),
(3, 2),
(3, 3),
(3, 4),
(4, 1),
(4, 3),
(4, 4);

Tras hacer un buscador, necesitaría:
- TODOS LOS COCHES QUE TUVIERAN EL EXTRA 2 Y EL EXTRA 4 --> Debe devolver el coche 2 y el coche 3.

Usando el JOIN y si sólo se necesita buscar un extra es sencillo, pero cuando hay que hacer la búsqueda con más de un extra, no sé si usar una subconsulta y cómo sería, si un JOIN,...

Estoy algo desesperado, UN MILLÓN DE GRACIAS
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
sin imagen de perfil

Duda con consulta

Publicado por DAVID (63 intervenciones) el 07/04/2016 08:00:11
Hola buenas,

haz un Join de las dos tablas, y después en el where pones la condicion de que el extra debe ser 2 y 3. Después agrupas por id coche y lo tendrías, no?

Un saludo,
David
paginas web economicas
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 con consulta

Publicado por Javi (3 intervenciones) el 07/04/2016 08:53:32
Hola David, gracias por la respuesta.

Inicialmente es lo primero que hice, pero al poner en el where que el id sea 2 y 3 tras el join, nunca devolverá ningún resultado, ya que al hacerse la comprobación registro a registro, nunca el id_extra será 2 y 3 a la vez. Esta solución funciona si sólo se marcase un único extra

En caso de poner 2 OR 3, recibiría como resultado el coche que tuviera ambos extras o sólo uno de ellos.

Tras mucho probar, he dado con una posible solución, desconozco si es la más óptima, pero funciona. Evidentemente ya la he programado de forma dinámica en la web.

1
2
3
4
5
6
7
8
SELECT c.*
FROM coches c
INNER JOIN (SELECT ec.id_coche as idCoche, COUNT(ec.id_coche) as total
		FROM extras_coches ec
		WHERE ec.id_extra = 2 OR ec.id_extra = 4
		GROUP BY id_coche
		HAVING total=2) as testea
	ON c.id = testea.idCoche

Gracias David
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
sin imagen de perfil

Duda con consulta

Publicado por DAVID (63 intervenciones) el 07/04/2016 12:38:20
cierto. No caí en eso. :-/.
Y si haces dos select y luego un union de ambas y las agrupas por id?? con eso lo tendrías, no?

Un saludo,
David
estudio de diseño grafico
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 con consulta

Publicado por Javier (1 intervención) el 07/04/2016 13:37:14
Buenas David,

Si hago dos select y luego los uno me encontraré en la misma situación no? o Incluso peor.
Me explico:

- La primera select saca los que tienen el extra 2.
- La segunda select saca los que tienen el extra 4.

Al unirlos, habría coches con sólo el extra 2, sólo con el extra 4 y, efectivamente, los que tienen ambos. Sólo me interesan los últimos.

Aparte de esto, esta consulta es para un buscador de vehículos según los extras marcados, por lo que puedo necesitar buscar sin extras, por 1 extra o por 15 extras, por lo que el UNION de 2 select no me da la potencia y versatilidad que necesito.


Así lo veo yo!
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
sin imagen de perfil

Duda con consulta

Publicado por DAVID (63 intervenciones) el 07/04/2016 13:41:20
creo que ya lo tengo. :-)

1
2
3
4
5
6
select coche, count(*)
from coches c, extras_coches e
where c.id=e.id
and e in (2, 4)
group by id
having count(*)>1

Algo así que tal?

Un saludo,
David
estudio de diseño grafico
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Duda con consulta

Publicado por Javier (3 intervenciones) el 12/04/2016 08:37:49
Hola David.

Parece que funciona si.

Ya tengo la consulta que me funcionó metida en el proyecto. Cuando lo acabé haré mediciones de rendimiento en ambas consultas y veré con cuál me quedo.

Muchas gracias!!
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
sin imagen de perfil

Duda con consulta

Publicado por DAVID (63 intervenciones) el 12/04/2016 09:17:25
De nada!! me alegro de que te haya servido, al menos, un poco.

Un saludo,
David
soluciones web
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