MySQL - Consulta sobre columna key value

 
Vista:
sin imagen de perfil

Consulta sobre columna key value

Publicado por Andrea (3 intervenciones) el 02/10/2017 12:40:36
Hola a todos. Tengo un proyecto de una inmobiliaria en el cual me gustaria tener dos tablas:
1: Tabla product
id
name
timestamp

2: Tabla values
prodid => relacinada con el producto
key
value

como puedo hacer una consulta parecida a :

1
SELECT * FROM product INNERJOIN values ON product.id=values.prodid WHERE key='precio' AND value<900 AND WHERE key='baños AND values='2'

Esta consulta siempre me devolvera false logicamente pero con con OR me devolveria siempre true si solo uno de los valores fuera verdadero.

Espero que hayan entendido como lo quiero hacer, de momento he hecho un backend que crea y borra filas de la tabla 'values' pero no la veo la mejor forma.
Despues de mucho buscar espero una respuesta.
Mil gracias a todos
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
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Consulta sobre columna key value

Publicado por leonardo_josue (414 intervenciones) el 02/10/2017 15:52:11
Hola Andrea:

1
Espero que hayan entendido...

Más bien deberías decir, "Espero haberme explicado bien", y no, lamentablemente no se entiende qué es lo que quieres hacer...

De entrada tienes errores sintácticos en tu consulta, ya que no puedes poner dos veces la palabra reservada WHERE, entonces debes hacer uso sólo de los operadores AND, OR y NOT...

Tal vez nos serviría más si pones datos de ejemplo de tus tablas y a partir de esos datos de ejemplo decirnos qué es lo que quieres filtrar... también deberías de revisar la JERARQUÍA DE OPERADORES RELACIONALES, ya que AND y OR no se ejecutan en el mismo orden, por lo tanto debes hacer uso de paréntesis:

¿A qué me refiero con esto? pues que de manera similar que en matematicas, si haces 1+2*3 = 7, ya que se ejecuta primeramente la multiplicación que la suma ya * tiene mayor jerarquía que +. Para cambiar el orden entonces usas paréntesis, (1+2)*3 = 9, ya que los paréntesis tienen más jerarquía que la multiplicación.

En otras palabras, no es lo mismo poner

1
2
3
...
WHERE campo1 = 10 OR campo2 = 20 AND campo 3 = 30
...

a poner

1
2
3
...
WHERE (campo1 = 10 OR campo2 = 20) AND campo 3 = 30
...

Ojo con eso.

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

Consulta sobre columna key value

Publicado por Andrea (3 intervenciones) el 02/10/2017 16:32:50
Ya no soy muy bueno explicandome.

tengo estas dos tablas

PRODUCTO
_____________
| id | name

| 1 | casa


PROPERTY
_______________________________________________
id | key | value | prodid
1 | banos | 2 | 1
1 | habitaciones | 4 | 1
1 | superficie | 200 |

Como puedo generar una consulta para un buscador donde (por ejemplo) quiero una casa con minimo 2 baños 4 habitaciones y 200m2?

si lo intento con :

SELECT * FROM producto INNER JOIN property WHERE (key='banos' AND value>1) OR (key=habitaciones AND value > 3) OR (KEY=superficie AND value > 199)

Esta consulta con que coincida uno de los valores me devolverá true peró que pasa si quiero que tenga 3 baños? No deberia devolverme el producto por la coincidencia pero obviamente por la consulta me lo devolverá y no se como filtrarlo.

La tabla property de momento tiene una columna por propiedad la cual el cliente desde el backend borra y inserta columnas.
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
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Consulta sobre columna key value

Publicado por leonardo_josue (414 intervenciones) el 03/10/2017 18:06:35
Hola de nuevo Andrea:

En realidad tienes muchas formas de obtener lo que quieres, la más simple sería con subconsultas, pero puede que no sea la mejor opción, pero veamos si esto te puede servir... para el ejemplo voy a tomar estas 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
mysql> SELECT * FROM producto;
+------+--------+
| id   | nombre |
+------+--------+
|    1 | casa   |
|    2 | casa 2 |
|    3 | casa 3 |
+------+--------+
3 rows in set (0.00 sec)
 
mysql> SELECT * FROM propiedades;
+------+--------------+-------+--------+
| id   | propiedad    | valor | prodid |
+------+--------------+-------+--------+
|    1 | banos        |     2 |      1 |
|    1 | habitaciones |     4 |      2 |
|    1 | superficie   |   200 |      3 |
|    2 | banos        |     1 |      4 |
|    2 | habitaciones |     2 |      5 |
|    2 | superficie   |    90 |      6 |
|    3 | banos        |     2 |      7 |
|    3 | habitaciones |     3 |      8 |
|    3 | superficie   |   180 |      9 |
+------+--------------+-------+--------+
9 rows in set (0.00 sec)


Cambié algunos nombres de tablas y campos debido a mejores prácticas en SQL ya que no es recomendable poner nombres de campos como palabras reservadas (VALUE, PROPERTY, KEY, etc.) Una forma de hacer lo que quieres, como dije es con subconsultas utilizando el operador EXISTS, para el filtro que quieres obtener, sería algo así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
mysql> SELECT *
    -> FROM producto T1
    -> WHERE
    -> EXISTS ( SELECT id
    ->          FROM propiedades T2
    ->          WHERE T1.id = T2.id
    ->          AND T2.propiedad = 'banos' AND T2.valor >= 2)
    -> AND
    -> EXISTS ( SELECT id
    ->          FROM propiedades T2
    ->          WHERE T1.id = T2.id
    ->          AND T2.propiedad = 'habitaciones' AND T2.valor >= 3)
    -> AND
    -> EXISTS ( SELECT id
    ->          FROM propiedades T2
    ->          WHERE T1.id = T2.id
    ->          AND T2.propiedad = 'superficie' AND T2.valor >= 200);
+------+--------+
| id   | nombre |
+------+--------+
|    1 | casa   |
+------+--------+
1 row in set (0.00 sec)

Observa que cada Subconsulta corresponde a una de las condiciones que estás colocando, de tal suerte que se tienen que cumplir todas para que aparezca un registro... en el caso de la casa con ID=1 no cumple que tenga al menos 3 habitaciones y en el caso del la casa con ID=2 no cumple con el filtro de que tenga al menos 200 metros de superficie.

Esta no es la única manera ni la mejor, pero creo que te puede servir para lo que quieres. Dale un vistazo 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
1
Comentar
sin imagen de perfil

Consulta sobre columna key value

Publicado por Andrea (3 intervenciones) el 03/10/2017 20:42:12
Perfecto...... MIL GRACIAS Está funcionando de maravilla....
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