MySQL - solo mostrar los resultados proximos por id

 
Vista:
Imágen de perfil de mrc
Val: 11
Ha disminuido su posición en 2 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

solo mostrar los resultados proximos por id

Publicado por mrc (6 intervenciones) el 20/02/2019 19:56:05
Muy buenas a tod@s,

No sé si alguien me podrá ayudar con un problema que tengo al realizar una consulta a la base de datos y que me tiene atascado....

El caso es que quiero realizar una consulta sencilla a la base de datos (que tiene cerca de 1000 registros )que tengo ordenada de la siguiente manera con una clave primaria incremental "id":

DATOS:

id pos_1 pos_2 pos_3 pos_4 pos_5


*la id:1,2,3,4,5,6... 1000.
*cada una de las columnas tiene 1 dato.
*la consulta se realiza a través de un form sencillo con 5 inputs.




la query que realizo es:

sql1 = "SELECT * FROM listado WHERE (pos_1 = '$num1' AND pos_2 = '$num2' AND pos_3 = '$num3' AND pos_4 = '$num4' AND pos_5 = '$num5')";
$ejecutar1 = mysqli_query($conexion, $sql1);
$registro1 = mysqli_fetch_array($ejecutar1);


Hasta aquí todo bien, a través del index en el que tengo un form a modo de buscador con 5 inputs al introducirlos y darle a buscar en el submit la consulta me devuelve las lineas que se corresponden con la busqueda introducida.
El problema viene cuándo lo que yo quiero es que el SELECT sólo me devuelva los registros de la tabla de la base de datos QUE SE ENCUENTRAN CERCANOS POR "id".
Es decir, que el SELECT me devuelva sólo los registros o lineas que a parte de coincidir con las columnas: pos_1 pos_2 pos_3 pos_4 pos_5 esas lineas o registros disten no menos de X posiciones de "id" entre si.

Me explico, ahora mismo me devuelve todos los registros de la consulta que coindicen con los de la tabla de la base de datos como cualquier otra consulta, pero la idea es que me devuelva de todos esos registros SÓLO los que se encuentra proximos por ID, y que la distancia o cercania de IDs se pueda elegir. Así si yo realizo la query indicando que quiero que los resultados a mostrar no disten más de 5 posiciones POR ID, solo me muestre esas tuplas en las que los resultados son cercanos por ID ntre si.

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

solo mostrar los resultados proximos por id

Publicado por leonardo_josue (414 intervenciones) el 20/02/2019 22:18:19
Hola mrc...

No estoy seguro de haber entendido correctamente tu concepto de "cercanos" pero vamos a ver si este ejemplo te sirve para lo que quieras.

Supongamos que tenemos esta tabla;

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> SELECT * FROM tabla;
+------+------+------+------+
| id   | pos1 | pos2 | pos3 |
+------+------+------+------+
|    1 |    1 |    2 |    3 |
|    4 |    1 |    2 |    3 |
|    5 |    1 |    2 |    3 |
|   11 |    1 |    2 |    3 |
|   12 |    1 |    1 |    1 |
|   17 |    1 |    2 |    3 |
|   19 |    1 |    2 |    3 |
+------+------+------+------+
7 rows in set (0.00 sec)

Entonces, si buscamos registros con pos1 = 1, pos2 = 2 y pos3 = 3, tenemos esto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> SELECT *
    -> FROM tabla
    -> WHERE pos1 = 1 and pos2 = 2 and pos3 = 3;
+------+------+------+------+
| id   | pos1 | pos2 | pos3 |
+------+------+------+------+
|    1 |    1 |    2 |    3 |
|    4 |    1 |    2 |    3 |
|    5 |    1 |    2 |    3 |
|   11 |    1 |    2 |    3 |
|   17 |    1 |    2 |    3 |
|   19 |    1 |    2 |    3 |
+------+------+------+------+
6 rows in set (0.00 sec)

Ahoora, si definimos que entre los ID's no debe de haber una distancia de más de 5, observamos que el id = 11 NO CUMPLE CON ESTA CONDICIÓN, ya hay 6 posiciiones entre el id menor (5) y el id mayor (17)... entonces, podríamos hacer una consulta así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
mysql> select *
    -> from tabla T1
    -> where pos1 = 1 and pos2 = 2 and pos3 = 3
    -> and exists (
    ->   select id
    ->   from tabla T2
    ->   where
    -> T2.pos1 = 1 and pos2 = 2 and pos3 = 3
    -> and T2.id >= T1.id - 5
    ->         and T2.id <= T1.id + 5
    -> and T1.id != T2.id);
+------+------+------+------+
| id   | pos1 | pos2 | pos3 |
+------+------+------+------+
|    1 |    1 |    2 |    3 |
|    4 |    1 |    2 |    3 |
|    5 |    1 |    2 |    3 |
|   17 |    1 |    2 |    3 |
|   19 |    1 |    2 |    3 |
+------+------+------+------+
5 rows in set (0.00 sec)


Es decir, agregamos una condición para QUE EXISTA AL MENOS OTRO ID QUE ESTÉ A UNA DISTANCIA DE 5 POSICIONES O MENOS...

Insisto, no sé si esto es más o menos lo que quieres hacer. Si no es así, pon datos de ejemplo y dinos a partir de esos datos cómo es que debes de aplicar el filtrado.

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

solo mostrar los resultados proximos por id

Publicado por mrc (6 intervenciones) el 20/02/2019 23:24:18
Hola Leo,

Ante todo mil gracias por tú pronta respuesta y tu interés en la misma. Decir que la respuesta que me has dado me va a servir al 100% para lo que quería hacer que es exactamente lo que tú me has explicado, así que genial!! no pensaba resolver está cuestión tan rapidamente!!! jjeje es de envidiar la verdad los conocimientos y la capacidad resolutiva de los problemas que tenéis much@s de los programador@s de este foro! nuevamente gracias y un saludo.(seguiremos aprendiendo jeje)

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

solo mostrar los resultados proximos por id

Publicado por mrc (6 intervenciones) el 21/02/2019 09:48:28
Buenas Leo,

Estoy intentando realizar la consulta exactamente igual que me has indicado tú, pero debo de estar cometiendo algún error de sintaxis ya que no me está saliendo correctamente... Yo tengo el programa escrito puramente en PHP y SQL y núnca había usado la sentencia EXISTS:



index.html:

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
<html>
	<head>
		<link href="estilo.css" rel = "stylesheet">
		<meta charset = "UTF-8">
		<title>LISTADO</title>
	</head>
	<body>
		<div id="todo">
			<h1>BUSQUEDA</h1>
 
			<form action="buscar3.php" method="POST">
				<select name="caja100" class="select">
 
					<option value="5">5</option>
				</select>
				<input type="text" name="caja1" placeholder="00" maxlength="2" class="cajetin">
				<input type="text" name="caja2" placeholder="00" maxlength="2" class="cajetin1">
				<input type="text" name="caja3" placeholder="00" maxlength="2" class="cajetin1">
				<input type="text" name="caja4" placeholder="00" maxlength="2" class="cajetin1">
				<input type="text" name="caja5" placeholder="00" maxlength="2" class="cajetin1">
 
 
				<input type="submit" value="Buscar" class="boton">
			</form>
		</div>
	</body>
</html>



buscar3.php:

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
<html>
	<head>
		<link href="estilo.css" rel = "stylesheet">
		<meta charset = "UTF-8">
		<title>Busqueda</title>
	</head>
	<body>
		<div id="todo">
			<h1>RESULTADOS</h1>
			<?php
			include("conexion.php");
			for ($var = 1; $var < 51; $var ++){
				${"num".$var} = $_POST["caja$var"];
			}
 
			$coin = $_POST["caja100"];
 
 
 
			if($coin == 5){
 
 
                $sql1 = "SELECT * FROM listado WHERE pos_1 = '$num1' AND pos_2 = '$num2' AND pos_3 = '$num3' AND pos_4 = '$num4' AND pos_5 = '$num5'";
                $ejecutar1 = mysqli_query($conexion, $sql1);
                $registro1 = mysqli_fetch_array($ejecutar1);
 
 
                if($registro1){
                    do{
                        $fecha = $registro1["id"];
                        $dig1 = $registro1["pos_1"];
                        $dig2 = $registro1["pos_2"];
                        $dig3 = $registro1["pos_3"];
                        $dig4 = $registro1["pos_4"];
                        $dig5 = $registro1["pos_5"];
                        $total = $dig1.$dig2.$dig3.$dig4.$dig5;
 
                        echo "
                            <div class='resul'>
                                <div class='cajetin5'>$fecha</div>
                                <div class='cajetin4'>$dig1</div>
                                <div class='cajetin4'>$dig2</div>
                                <div class='cajetin4'>$dig3</div>
                                <div class='cajetin4'>$dig4</div>
                                <div class='cajetin4'>$dig5</div>
                            </div>
                        ";
 
 
                    }while($registro1 = mysqli_fetch_array($ejecutar1));
 
                }else{	echo "
                    <div class='resul'>
                        <p>Sin resultados</p>
                    </div>
                    ";
 
                }
            }
 
			?>
 
 
			<button class="boton" onclick="window.location.href='finalizarsesion.php'">Volver a busqueda</button>
		</div>
	</body>
</html>



La tabla es la ya indicada anteriormente:

id pos_1 pos_2 pos_3 pos_4 pos_5


Gracias de nuevo!
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

solo mostrar los resultados proximos por id

Publicado por leonardo_josue (414 intervenciones) el 21/02/2019 22:02:51
Hola de nuevo mrc:

1
2
Estoy intentando realizar la consulta exactamente igual que me has indicado tú, pero debo de estar
cometiendo algún error de sintaxis ya que no me está saliendo correctamente...

¿A qué te refieres con que no te está saliendo correctamente la consulta? Si tu programa está arrojando algún error, entonces dinos cual es el error. Si el problema es que no estás obteniendo los resultados esperados, entonces postea datos de ejemplo "reales" y dinos a partir de esos datos qué es lo que estás obteniendo con la consulta y qué es lo que esperas obtener, así será más factible que podamos indicarte donde está el problema.

Te comento que el código PHP que pones, está completamente de más en este foro, ya que aquí solo se tratan temas de MySQL, si quieres postear código PHP te sugiero que lo publiques en el foro correspondiente, esto es por respeto a todos los foristas, ya que como yo, puede que no conozcamos nada de PHP pero sabemos algo de MySQL.

En este sentido, dato que estás formando tu consulta sql "al vuelo", te recomiendo que revises cómo queda formada antes de que se ejecute y si es posible que ejecutes dicha sentencia directamente en una consola de MySQL, Workbench o cualquier otro IDE de MySQL, así, si tienes un error de sintaxis como sospechas, el motor de MySQL te podrá dar más detalles del mismo.

También podría ser que la consulta se ejecute correctamente en MySQL, luego entonces el problema estaría en el código de PHP.

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

solo mostrar los resultados proximos por id

Publicado por mrc (6 intervenciones) el 21/02/2019 22:42:05
Hola Leo,

de nuevo gracias por tú pronta respuesta, a tu primera parte de la contestación decir que probé en mi equipo a realizar la misma consulta de sql que tú me habías propuesto inicialmente, ya que en efecto es justo lo que pretendo hacer con el programa (resultados->id por proximidad) y tras intentar adaptar el código de sql que me muestras a mi propia formulación no logro obtener el resultado que a ti si que te muestra en la tabla de arriba con las ID´s más próximas... no es que haya un fallo en concreto, es que directamente no sé ni cómo adaptarlo a mi formulación(la que puedes ver en el archivo "busqueda.php"). El echo de que colocara todo el código del programa en mi pregunta no era otro que la intención de mostrar todas lineas del programa para que resultará más clara la pregunta, realmente cómo me indicas no era necesario ya que el problema está únicamente en la propia query... No tengo mucha experiencia cómo programador y al ver tú código me pareció una consulta sql para lenguaje "C" y no sé cómo adaptarlo a lo que puedes ver que yo tengo...

mi sql:

1
sql1 = "SELECT * FROM listado WHERE (pos_1 = '$num1' AND pos_2 = '$num2' AND pos_3 = '$num3' AND pos_4 = '$num4' AND pos_5 = '$num5')";

Tú sql:

1
2
3
4
5
6
7
8
9
10
11
select *
    -> from tabla T1
    -> where pos1 = 1 and pos2 = 2 and pos3 = 3
    -> and exists (
    ->   select id
    ->   from tabla T2
    ->   where
    -> T2.pos1 = 1 and pos2 = 2 and pos3 = 3
    -> and T2.id >= T1.id - 5
    ->         and T2.id <= T1.id + 5
    -> and T1.id != T2.id);


Las uniones que haces con T2.pos1, T1.id o T2.id a nivel lógico las entiendo y cómo te decía tú respuesta es lo que buscaba pero me veo perdido al adaptar tus lineas a mi query...

Gracias y un saludo de nuevo 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 mrc
Val: 11
Ha disminuido su posición en 2 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

solo mostrar los resultados proximos por id

Publicado por mrc (6 intervenciones) el 22/02/2019 18:33:10
Buenas Leo,

al final lo estoy ejecutando cómo me comentaste directamente en la consola del PHPMYADMIN y cómo la query que me diste está construída totalmente en sql me funciona perfecto
En el foro de PHP ya he preguntado a ver si alguién sabría realizar la misma query con PHP tal y cómo yo lo tengo pero de momento para salir del paso voy a usarlo en la consola directamente.

Gracias por la ayuda y un saludo
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