MySQL - Consulta Por Busqueda Numerica con espacios

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

Consulta Por Busqueda Numerica con espacios

Publicado por salvatore (1 intervención) el 21/10/2017 15:43:35
Muy buenos dias queria realizarles la siguiente consulta de busqueda
tengo dias buscando y nada que consigo


tengo por ejemplo la variable
1
$_GET["info"] = SEOESPECIALIDADES($_GET["info"]);

y tengo la consulta

1
2
3
4
5
6
7
8
9
$search = '';
if (isset($_GET['info'])){
$search = strtolower($_GET['info']);
}
 
$query_Mascompesp = "SELECT * FROM tblcategoria WHERE tblcategoria.Especialidadcatempresa LIKE  '%".$search."%' ORDER BY tblcategoria.idCategoria DESC";
$Mascompesp = mysqli_query($conexion, $query_Mascompesp) or die(mysqli_error($conexion));
$row_Mascompesp = mysqli_fetch_assoc($Mascompesp);
$totalRows_Mascompesp = mysqli_num_rows($Mascompesp);

en un registro tengo la siguiente manera en el campo tblcategoria.Especialidadcatempresa [21 1 2 7]

Cuando la varia $_GET["info"] = 2

Se muestra tambien los registro que tenga el id 21 hace similitud y si es 21 me muestra tambien el 2 y 1

Nose si me puedan ayudar con esto estare muy agredecido
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 Por Busqueda Numerica con espacios

Publicado por leonardo_josue (414 intervenciones) el 23/10/2017 16:04:46
Hola Salvatore:

En primer lugar, el hecho de que tengas un campo multivaluado es un pésimo diseño... si estuvieras en un curso de Base de Datos, implicaría que fueras reprobado y si diseñaras esto en una empresa implicaría que podrías ser despedido. Así de grande es el error... no sé si tú diseñaste esto, pero te sugiero, si es posible, que lo cambies para tener una tabla resolutiva, que es la manera correcta para modelar esto:

es decir, en lugar de tener algo así:

1
2
3
4
5
6
7
8
9
mysql> SELECT * FROM t_empresas_2;
+------------+-------------+--------------+
| id_empresa | nombre      | especialidad |
+------------+-------------+--------------+
|          1 | empresa uno | 1 2 3        |
|          2 | empresa dos | 1 3          |
|          3 | empresa 3   | 2            |
+------------+-------------+--------------+
3 rows in set (0.00 sec)

haces un modelo con dos tablas catálogos (una para empresas y una para especialidades) y una tabla resolutivas, donde pones un registro por cada especialidad de cada empresa:

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
mysql> SELECT * FROM t_empresas;
+------------+--------------+
| id_empresa | nombre       |
+------------+--------------+
|          1 | empresa uno  |
|          2 | empresa dos  |
|          3 | empresa tres |
+------------+--------------+
3 rows in set (0.00 sec)
 
mysql> SELECT * FROM t_especialidades;
+-----------------+----------------------+
| id_especialidad | descripcion          |
+-----------------+----------------------+
|               1 | primer especialidad  |
|               2 | segunda especialidad |
|               3 | tercer especialidad  |
+-----------------+----------------------+
3 rows in set (0.00 sec)
 
mysql> SELECT * FROM t_empresas_especialidades;
+-------------------------+------------+-----------------+
| id_empresa_especialidad | id_empresa | id_especialidad |
+-------------------------+------------+-----------------+
|                       1 |          1 |               1 |
|                       2 |          1 |               2 |
|                       3 |          1 |               3 |
|                       4 |          2 |               1 |
|                       5 |          2 |               3 |
|                       6 |          3 |               2 |
+-------------------------+------------+-----------------+
6 rows in set (0.00 sec)
-

Ahora bien, volviendo a tu problema, este es ocasionado justamente por tener valores múltiples en un mismo campo... ya que la función LIKE tal como la pones ('%2%') sirve para obtener registros "parecidos"... por lo tanto un 2 se "parece" a un 21 o a un 22 y a un 12 o a cualquier número que contenga un 2.

Ahora bien, si te interesan sólo aquellos registros que tienen exactamente el id = 2, entonces tienes que cambiar tu condición, pero ahora viene una complicación, ya que el id = 2 puede estar al inicio de una serie de números, en medio, al final o puede estar sólo el numero dos, es decir, algo asi:

1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT * FROM t_empresas_2;
+------------+----------------+--------------+
| id_empresa | nombre         | especialidad |
+------------+----------------+--------------+
|          1 | empresa uno    | 21,1,2,3     |
|          2 | empresa dos    | 2,1,3        |
|          3 | empresa tres   | 1,12,2       |
|          4 | empresa cuatro | 2            |
|          5 | empresa cinco  | 12,21,22     |
+------------+----------------+--------------+
5 rows in set (0.00 sec)

(para el ejercicio estoy suponiendo que el separador de los id's es una coma). Entonces, lo que debes hacer es una búsqueda para cada una de estas opciones:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> SELECT *
    -> FROM t_empresas_2
    -> WHERE
    -> especialidad = '2' OR  -- único
    -> especialidad LIKE '2,%' OR -- al inicio
    -> especialidad LIKE '%,2,%' OR -- en medio
    -> especialidad LIKE '%,2'; -- al final;
+------------+----------------+--------------+
| id_empresa | nombre         | especialidad |
+------------+----------------+--------------+
|          1 | empresa uno    | 21,1,2,3     |
|          2 | empresa dos    | 2,1,3        |
|          3 | empresa tres   | 1,12,2       |
|          4 | empresa cuatro | 2            |
+------------+----------------+--------------+
4 rows in set (0.00 sec)

De esta manera el último registro, aunque tiene cosas "parecidad" al 2, no se presenta porque no tiene exactamente el elemento 2. ¿Se entiende?

Esto sin embargo también es una terrible forma de hacer consultas, por lo tanto NO ES RECOMENDABLE EN ABSOLUTO.

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