Ver Mensaje Individual
  #7 (permalink)  
Antiguo 05/09/2017, 20:57
Avatar de mortiprogramador
mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: seleccionar campos con valores null

Saludo

Uhm, bueno, leyendo con un poco de calma el post inicial,
creo entender lo siguiente.

Se tiene la tabla productos en donde tendrá un campo llamado codebarras
que es el que se relaciona con la tabla productosVehiculos al campo codebarra

Según entiendo este modelo, en la tabla de productosVehiculos se
insertará la misma información siempre tantos productos como tenga relacionado un vehículo, no??

De ser así, lo mejor sería manejar una tabla vehiculo como tal que tenga
todas las características del vehículo, y luego que en la tabla productosVehiculos
solo esten el id del vehiculo y el id del producto, y luego la consulta tendría
que cambiar a hacer uso de estas tres tablas.

Pero digamos que se mantiene el modelo...
¡Vamos a jugar un rato!

Código SQL:
Ver original
  1. CREATE TABLE productos(id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, nombre VARCHAR(120), codebarras INT(6) NOT NULL,
  2. clase1 VARCHAR(120), clase2 VARCHAR(120), clase3 VARCHAR(120));
  3.  
  4. CREATE TABLE productosVehiculos (id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, codigobarras INT(6), año VARCHAR(4),
  5. marca VARCHAR(120), modelo VARCHAR(120), version VARCHAR(120), motor VARCHAR(120));
  6.  
  7. INSERT INTO  productos(nombre, codebarras, clase1, clase2, clase3) VALUES
  8. ('disco freno', 123, 'Mantenimiento', 'freno', NULL),
  9. ('Tapón de carter', 234, 'Mantenimiento', 'Motor y relacionados', 'Carter / Relacionados'),
  10. ('aceite motor', 456, 'Aditivos / Grasas / Lubricantes', 'Aceites de motor', NULL);
  11.  
  12. INSERT INTO  productosVehiculos (codigobarras, año, marca, modelo, version, motor) VALUES
  13. (123, NULL, 'Honda', 'Pilot', NULL, NULL),
  14. (234, 2013, 'Honda', 'Pilot', 'Touring 4x4', 'V6 3.5 24V'),
  15. (456, NULL, NULL, NULL, NULL, NULL);

Esto basado en los datos que se incluyeron en el post inicial.

Ahora, si ejecutamos esta consulta.

Código SQL:
Ver original
  1. -- Solo traigo los campos que considero necesarios, manejar el * es bueno para traer todo de zopetón,
  2. -- pero eso va a tardar más en traer la info, y más si son muchos datos
  3. SELECT p.id, p.nombre, p.clase1, p.clase2, p.clase3, v.id, v.codigobarras, v.año, v.marca, v.modelo, v.version, v.motor
  4. FROM productosVehiculos v
  5. LEFT JOIN productos p
  6. ON v.codigobarras = p.codebarras
  7. -- 1) los que tienen todos los requisitos del vehiculo definido (año, marca,modelo,version, motor)
  8. WHERE v.año = '2013' AND v.marca = 'Honda' AND v.modelo = 'Pilot' AND v.version = 'Touring 4x4' AND v.motor = 'V6 3.5 24V';

Traerá solo un registro (Tapón de carter).

Si ejecutamos esta otra

Código SQL:
Ver original
  1. SELECT p.id, p.nombre, p.clase1, p.clase2, p.clase3, v.id, v.codigobarras, v.año, v.marca, v.modelo, v.version, v.motor
  2. FROM productosVehiculos v
  3. LEFT JOIN productos p
  4. ON v.codigobarras = p.codebarras
  5. -- 2) los que solo tienen definido como (marca, modelo)
  6. WHERE v.marca = 'Honda' OR v.modelo = 'Pilot' ;

Traerá dos registros (disco freno y Tapón de carter)

Que sería lo mismo que unir las condiciones de los dos querys anteriores
en un solo 'gran query' (como decía una desarrolladora con la que trabaje hace tiempo)

Código SQL:
Ver original
  1. WHERE v.año = '2013' AND v.marca = 'Honda' AND v.modelo = 'Pilot' AND v.version = 'Touring 4x4' AND v.motor = 'V6 3.5 24V'
  2. OR (v.marca = 'Honda' OR v.modelo = 'Pilot');

Trayendo los dos registros pues se cumplen las condiciones del punto 1 y 2.

En cuanto al tercer punto

3) los que no tienen ningun vehiculo definido (los productos aplica para todos los vehiculos)

¿Cómo se sabe que no tienen ningún vehículo definido? Al tener todos los campos en NULL?

Entonces podría agregarse este otro condicional al 'gran query'

Código SQL:
Ver original
  1. OR (v.año IS NULL AND v.marca IS NULL AND v.modelo IS NULL AND v.version IS NULL AND v.modelo IS NULL);

Trayendo en este caso tres registros (disco freno, tapón de carter y aceite motor)

Creo que por ahora ya es 'game over',
ya veremos si te sirve así o si quieres otra partida,
en cuyo caso sería genial contar con muchos más datos y demás.
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com