MySQL - darle prioridad a una condición

 
Vista:
sin imagen de perfil
Val: 28
Ha aumentado su posición en 2 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

darle prioridad a una condición

Publicado por David (16 intervenciones) el 15/01/2018 13:32:52
Buen dia, amigos necesito ayuda con esta consulta,

1
select * from manejo where MESA = 10 and LINEA= 1 or linea=0 order by FECHA_PROCESO desc limit 1
lo que necesito es que la consulta le de prioridad a "linea 1" como si fuera un if, y si no hay" linea = 1" que se ejecute el "linea= 0"

gracias de ante mano
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 xve
Val: 796
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

darle prioridad a una condición

Publicado por xve (1151 intervenciones) el 15/01/2018 15:09:24
Hola David, una manera simple de hacerlo, es hacer un union de las dos consultas... de esta manera, te aseguras de que el primer registro es del tipo que quieres... algo así:

1
2
3
4
5
6
select * from (
    SELECT * FROM `manejo` WHERE  MESA=10 and LINEA=1 order by FECHA_PROCESO desc
    union
    SELECT * FROM `manejo` WHERE  MESA=10 and LINEA=0 order by FECHA_PROCESO desc
) s1
limit 1

De esta manera, te ordena el listado con los registros primero de la LINEA=1, y luego LINEA=0.. en ese orden.

Espero que te sirva.
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: 28
Ha aumentado su posición en 2 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

darle prioridad a una condición

Publicado por David (16 intervenciones) el 15/01/2018 15:24:13
Hola, gracias por responder, cuando intento usar la sentencia en phpMyAdmin, me dice que
1
#1221 - Equivocado uso de UNION y  ORDER BY
a que se debe? 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
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

darle prioridad a una condición

Publicado por Leonardo Josué (414 intervenciones) el 15/01/2018 19:24:38
Hola David:

Creo que cabe hacer mención de un punto que es importante que conozcas para un futuro, ya que no se ha mencionado en los post's:

cuando trabajas con operadores AND y OR en una misma consulta, debes de tener cuidado de hacer un USO CORRECTO DE LOS PARÉNTESIS, ya que estos dos operadores TIENEN UNA JERARQUÍA DISTINTA. ¿qué significa esto?, que no es lo mismo que pongas:

1
2
3
4
5
...
where
   MESA = 10 and LINEA= 1 or linea=0
...
order by FECHA_PROCESO desc limit 1

1
2
3
4
5
...
where
   MESA = 10 and (LINEA= 1 or linea=0)
...
order by FECHA_PROCESO desc limit 1

Al igual que en matemáticas, el operador de multiplicación (*) y el de suma (+) tienen jerarquía distinta, por lo tanto no es lo mismo poner

1
1 + 2 * 3 = 7

a poner

1
(1 + 2) * 3 = 9

En el caso de SQL, el operador AND tiene más jerarquía que el OR, por lo tanto, se ejecuta primero.

Finalmente, en cuanto al error que te está arrojando la consulta que propone xve, creo que también tiene que ver con el uso de paréntesis, ya que por definición, una sentencia UNION, sólo puede tener una cláusula ORDER BY... prueba así:


1
2
3
4
5
6
select * from (
    (SELECT * FROM `manejo` WHERE  MESA=10 and LINEA=1 order by FECHA_PROCESO desc)
    union
    (SELECT * FROM `manejo` WHERE  MESA=10 and LINEA=0 order by FECHA_PROCESO desc)
) s1
limit 1

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
sin imagen de perfil
Val: 28
Ha aumentado su posición en 2 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

darle prioridad a una condición

Publicado por David (16 intervenciones) el 15/01/2018 20:36:26
Hola, gracias por la ayuda, primero gracias por tu aclaracion de los parentesis, me sirvio en un proyecto que tengo jaja, lo segundo aunque ambas sentencias funcionan, no me dan el dato que me gustaria, explico:

la idea es que segun la fecha del proceso me muestre el numero del proveedor segun la fila y la mesa, son 30 mesas (y tengo una tabla html distinta para cada, se maneja una sola tabla de manejo para los datos) y no a todas se le incerta un dato, mi objetivo es que al cargar la pagina me muestre solo lo ultimo ingresado de dicha hora, en caso de que no se ingrese nada, pues que no me muestre nada, ya que si no se ingresa nada, me muestra el dato del proceso anterior.
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
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

darle prioridad a una condición

Publicado por Leonardo Josué (414 intervenciones) el 15/01/2018 21:29:20
Hola de nuevo David:

Creo que estás equivocando la estrategia... hace algunos días posteaste este mismo problema (que por cierto nunca terminamos de entender) y decías que ya había quedado resuelto... ahora vuelves otra vez a plantearlo y tu explicación en nada se parece a lo que habías puesto en el otro post.

Ojo con eso. es conveniente que sea claro con tus planteamientos, no importa si te tomas mucho tiempo en redactar un post's o si tienes que postear muchas entradas para terminar de explicar el problema y que quede claro a los foristas.

En el otro post, que titulaste "Omitir un select" te había comentado que siempre que publiques un problema debes de postear la estructura de tus tablas y poner datos de ejemplo y a partir de esos datos de ejemplo decirnos qué es lo que esperas obtener como salida. Esto aplica SIEMPRE.

En cuanto a lo que planteas, me voy a quedar con esto:

1
2
mi objetivo es que al cargar la pagina me muestre solo lo ultimo ingresado de dicha hora, en caso de que no se ingrese
nada, pues que no me muestre nada,

Partiendo de esto que trataste de explicar como tu problema, aquí hay algo que igual y te puede servir.

Sopongamos que tienes esta tabla;

1
2
3
4
5
6
7
8
9
10
11
12
mysql> SELECT * FROM tabla;
+------+-------+---------------------+
| id   | mesa  | fecha               |
+------+-------+---------------------+
|    1 |     1 | 2018-01-15 14:06:00 |
|    2 |     1 | 2018-01-15 14:07:00 |
|    3 |     1 | 2018-01-15 14:10:00 |
|    4 |     2 | 2018-01-15 14:15:00 |
|    5 |     2 | 2018-01-16 09:06:00 |
|    6 |     3 | 2018-01-15 14:06:00 |
+------+-------+---------------------+
6 rows in set (0.00 sec)

Si observas la columna MESA, se tiene que la mesa 1 tiene tres entradas (con la misma fecha, pero distinta hora), la mesa 2 tiene dos entradoas (con fechas y hora distinta) y finalmente la mesa tres tiene una sola entrada. Ahora, según lo que comentas, te interesa la ULTIMA FECHA registrada para cada mesa, esto puedes hacerlo con una función MAX agrupando por mesa, es decir, algo así:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> SELECT
    ->   mesa, MAX(fecha) ultima_fecha
    -> FROM tabla
    -> GROUP BY mesa;
+------+---------------------+
| mesa | ultima_fecha        |
+------+---------------------+
|    1 | 2018-01-15 14:10:00 |
|    2 | 2018-01-16 09:06:00 |
|    3 | 2018-01-15 14:06:00 |
+------+---------------------+
3 rows in set (0.00 sec)

ahora imagina que lo que te interesa es saber el ID de estos registros, (o si tuvieras más campos, te interesarían los campos que corresponden a esa última fecha). Entonces, lo que haces es un INNER JOIN:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> SELECT T1.* FROM tabla T1
    -> INNER JOIN
    -> ( SELECT
    ->     mesa, MAX(fecha) ultima_fecha
    ->   FROM tabla
    ->   GROUP BY mesa ) T2 ON T1.mesa = T2.mesa AND
    ->                         T1.fecha = T2.ultima_fecha;
+------+------+---------------------+
| id   | mesa | fecha               |
+------+------+---------------------+
|    3 |    1 | 2018-01-15 14:10:00 |
|    5 |    2 | 2018-01-16 09:06:00 |
|    6 |    3 | 2018-01-15 14:06:00 |
+------+------+---------------------+
3 rows in set (0.00 sec)

De esta manera SÓLO EXTRAES EL REGISTRO CON LA ÚLTIMA FECHA.

Dale un vistazo para ver si esto te puede servir. y si no, haz caso de los consejo y trata de explicarte mejor.

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

darle prioridad a una condición

Publicado por David (16 intervenciones) el 15/01/2018 22:53:24
siento no poder expresarme mejor, y si dije que estaba resuelto por que con las sentencia me funciono pero ahora no me funciona, en fin voy a dejar mi terquedad y afan y explicarme mejor: va de 0
tengo esta tabla:

1
2
3
4
5
6
7
8
9
+------+------+-------------------------+------------------------+
|linea | mesa | fecha                   | canastillas            |
+------+------+-------------------------+------------------------+
|   1 |    10  | 2018-01-15 14:06:00 |    35                       |
|   2 |    8   | 2018-01-16 14:06:00 |    20                       |
|   0 |    0   | 2018-01-15 14:06:00 |    0                        |
|   0 |    0   | 2018-01-15 14:06:00 |    0                        |
|   0 |    0   | 2018-01-15 14:06:00 |    0                        |
+------+------+---------------------+----------------


estos campos se llenan con unos inputs de un php, pero los inputs no son obligatorios, por eso al ingresarlo se ingresan muchos 0,
ahora, en otro php yo mando a llamar lo ultimo que se registro, ahora pongo el ejemplo.

yo ingrese en la

1
linea 1 mesa 10 x canastillas y linea 2 mesa 8 x
la sentencia que estoy usando
1
select * from manejo where MESA=10 AND LINEA=1 OR LINEA=0 ORDER by FECHA_PROCESO desc LIMIT 1 (esta sentencia la uso en un codigo php que seria esta
1
2
3
4
5
6
<?php
$query = $mysqli -> query ("select * from manejo where MESA=10 AND LINEA=1 OR LINEA=0 ORDER by FECHA_PROCESO desc LIMIT 1  ");
while ($valores = mysqli_fetch_array($query)){
	echo "&nbsp;&nbsp;". $valores ["mesa"]."&nbsp;&nbsp;";
}
?>

en este punto empiezan los problemas... el priemero,
la sentencia deberia traerme esto:
1
2
3
4
5
+------+------+---------------------+------+
| id   | mesa | fecha               | canastillas |
+------+------+---------------------+------+
|    1 |    2 | 2018-01-15 14:10:00 |35|
+------+------+---------------------+------+

pero aveces lo muestra y aveces no, como si fuera ramdon,

lo segundo
usando los parentesis como lo dijsite si me muestra el dato pero, el caso es que como mencione arriba, tengo 30 tablas diferentes y este dato va en una de ellas por lo que el resto deben estar vacias o en cero.

si yo registro otro datos, digamos que :

1
2
3
4
5
6
7
8
9
+------+------+-------------------------+------------------------+
|linea | mesa | fecha                   | canastillas            |
+------+------+-------------------------+------------------------+
|   3 |    10  | 2018-01-15 14:16:00 |    5                       |
|  0  |    0   | 2018-01-16 14:16:00 |     0                       |
|   0 |    0   | 2018-01-15 14:16:00 |    0                        |
|   0 |    0   | 2018-01-15 14:16:00 |    0                        |
|   0 |    0   | 2018-01-15 14:16:00 |    0                        |
+------+------+---------------------+----------------

y realizo la consulta para dicha tabla, me muestra ese valor si, pero tambien en las otras tablas me sigue mostrando los otros valores, es decir, la linea 1 y 2 tenian valores del primer registro, y la linea 3 del segundo, quiero que en el segundo registro se omitan o no se vean los valores del primer registro.

part1

como ven en la imagen, hay tres tablas cada una con sus respectivos datos, ahora si yo ingreso un nuveo dato (en este caso mesa9 lina 1) el dato sale, si pero los datos anteriores tambien,
part2
y mi objetivo es que una vez se haga un nuevo registro todo se vea en 0 menos lo que se ingreso.
gracias, me costo un poco hacer este post espero que se entienda.
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