Foros del Web » Programando para Internet » PHP »

Consulta a un campo de una tabla con criterios distintos

Estas en el tema de Consulta a un campo de una tabla con criterios distintos en el foro de PHP en Foros del Web. Buenos días gente. Tengo el siguiente dilema, que ni siquiera supe especificar describir en el título el problema. Necesito filtrar una tabla de mysql con ...
  #1 (permalink)  
Antiguo 10/07/2017, 11:07
 
Fecha de Ingreso: noviembre-2010
Mensajes: 7
Antigüedad: 13 años, 4 meses
Puntos: 0
Pregunta Consulta a un campo de una tabla con criterios distintos

Buenos días gente.
Tengo el siguiente dilema, que ni siquiera supe especificar describir en el título el problema.
Necesito filtrar una tabla de mysql con php la cual tiene id de países e id de paquetes de viajes, ya que un paquete de viaje puede visitar varios países. O sea es una relación de muchos a muchos. En la tabla pueden haber varios registros que tengan el mismo id de paquete pero tengan distintos id de países. Espero que me entiendan esta parte.
[b]Ahora lo que nesecito es filtrar con php y mysql los paquetes de viaje que incluyan distintos países que se seleccionarán en un select de múltiple selección. O sea ej. Quiero que me muestre los paquetes que pasan por Francia, Alemania y España (pueden ser más o menos los seleccionados)
No me sirve ni el OR o el IN ya que tiene que incluir todos los paises que se seleccionen, no uno u otro.
Con el AND lógicamente fue lo que primero que probé pero también lógicamente después me di cuenta que si filtraba primero ej. con idPais = 12 y hacia AND idPais = 20 , el resultado siempre va a ser 0 porque después de filtrar por el primero no quedan registros con id diferente a ese.
Espero me entiendan el problema y si es una tontería sepan disculparme es que el cuagulo no me deja pensar a veces.
Desde ya muchas gracias!!!!
  #2 (permalink)  
Antiguo 10/07/2017, 18:33
Avatar de xfxstudios  
Fecha de Ingreso: junio-2015
Ubicación: Valencia - Venezuela
Mensajes: 2.448
Antigüedad: 8 años, 10 meses
Puntos: 263
Respuesta: Consulta a un campo de una tabla con criterios distintos

vas a tener que mostrar como están almacenados los datos en tu tabla para poder ayudarte, porque descifrar lo que escribiste esta complicado. Saludos
__________________
[email protected]
HITCEL
  #3 (permalink)  
Antiguo 11/07/2017, 12:57
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Consulta a un campo de una tabla con criterios distintos

Si estás utilizando una tercera tabla para registrar los pares paquete-país, básicamente tendrías que hacer una consulta cruzada en dicha tabla y en la de los paquetes. De esta manera, se seleccionarían todas las coincidencias de la tabla paquete-país que se encuentren en el grupo de identificadores seleccionados en el <select> y tomarías los datos de los paquetes coincidentes, para lo cual solo necesitas usar la función IN().

Código MySQL:
Ver original
  1. SELECT a.campos FROM tabla_mixta a LEFT JOIN tabla_paquetes b ON b.pk = a.fk WHERE a.id IN (identificadores)

__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #4 (permalink)  
Antiguo 12/07/2017, 12:29
 
Fecha de Ingreso: noviembre-2010
Mensajes: 7
Antigüedad: 13 años, 4 meses
Puntos: 0
Respuesta: Consulta a un campo de una tabla con criterios distintos

Cita:
Iniciado por Alexis88 Ver Mensaje
Si estás utilizando una tercera tabla para registrar los pares paquete-país, básicamente tendrías que hacer una consulta cruzada en dicha tabla y en la de los paquetes. De esta manera, se seleccionarían todas las coincidencias de la tabla paquete-país que se encuentren en el grupo de identificadores seleccionados en el <select> y tomarías los datos de los paquetes coincidentes, para lo cual solo necesitas usar la función IN().

Código MySQL:
Ver original
  1. SELECT a.campos FROM tabla_mixta a LEFT JOIN tabla_paquetes b ON b.pk = a.fk WHERE a.id IN (identificadores)

Gracias por la respuesta.
No me quedo claro tu idea.
Lo que yo tengo una tabla que se llama idpaises_idpaquetes, te pongo un ejemplo de lo que tiene.

tabla idpaises_idpaquetes
Código:
idPais	idPaquete
4	  201
25	  201
73	  201
4	  200
4	  203
73	  203
25	  200
73	  504
En este caso al hacer la consulta por ej:
filtrar paquetes que pasen por los países 4, 25 y 73. me tiene que dar como resultado "201" porque es el único paquete que pasa por los 3 países seleccionados.
Esto es lo que necesito y no le encuentro la vuelta
Gracias!!
  #5 (permalink)  
Antiguo 12/07/2017, 22:58
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Consulta a un campo de una tabla con criterios distintos

La cuestión es que, si se trata de una relación de muchos a muchos, esa tabla que muestras viene siendo una tercera tabla (aparte de las dos que se están relacionando) mediante la cual se realiza la relación. Sabiendo esto y ya que obtienes los códigos identificadores de los países existentes desde una lista desplegable, lo que tendrías que hacer es realizar una búsqueda cruzada, como la que mostré en mi anterior respuesta, filtrando los países por la columna del código identificador de los países registrados en la tabla de la relación (la que muestras).

Código MySQL:
Ver original
  1. SELECT a.idPais, a.idPaquete, b.destinoPaquete FROM tabla_idpaises_idpaquetes a LEFT JOIN tabla_paquetes b ON b.idPaquete = a.idPaquete WHERE a.idPais IN (valores de la lista desplegable)

Por ejemplo, tomando como referencia los valores que muestras, si de la lista desplegable se seleccionarán los países cuyos códigos identificadores fueran el 4 y el 73, se mostrarían lo siguiente:

Código Resultado:
Ver original
  1. idPais    idPaquete   destinoPaquete ...más columnas que desees seleccionar
  2. ------------------------------------
  3.   4          201        Marruecos
  4.   4          200        Marruecos
  5.   4          203        Marruecos
  6.  73          201        Eslovenia
  7.  73          203        Eslovenia
  8.  73          504        Eslovenia

__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Última edición por Alexis88; 12/07/2017 a las 23:06 Razón: Alineación de datos
  #6 (permalink)  
Antiguo 13/07/2017, 11:59
 
Fecha de Ingreso: noviembre-2010
Mensajes: 7
Antigüedad: 13 años, 4 meses
Puntos: 0
Respuesta: Consulta a un campo de una tabla con criterios distintos

Lo vi si y ya lo había probado, pero en el ejemplo que tu pones también pasa que me muestra los paquetes que incluye uno o otro, yo necesito que me muestre solo los paquetes que incluyen todos los piases seleccionados.
  #7 (permalink)  
Antiguo 14/07/2017, 10:12
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Consulta a un campo de una tabla con criterios distintos

Admito que me faltó leer esa parte.

En ese caso, creo que hay muchas formas de obtener la intersección entre los países cuyas asociaciones con los paquetes coincidan en la misma cantidad, es decir, en donde exista la misma cantidad de asociaciones paquete-país que países.

Una de las que se me ocurre consiste en agrupar grupos de países y paquetes en donde los países se encuentren entre los que el usuario haya seleccionado de la lista desplegable:
Código PHP:
Ver original
  1. $seleccionOriginal = [4, 73];
  2. $seleccionFinal = implode(',', $seleccionOriginal);
  3. $total = count($seleccionOriginal) * 2;
  4.  
  5. $consulta = "SELECT CONCAT(GROUP_CONCAT(idpaquete), '-', GROUP_CONCAT(idpais)) AS bloque FROM paquete_pais WHERE idpais IN ($seleccionFinal) GROUP BY idpaquete";
  6. $resultado = $conexion->query($consulta) or exit($conexion->error);
  7.  
  8. if ($resultado->num_rows){
  9.     while ($registro = $resultado->fetch_assoc()){
  10.         $datos = explode('-', $registro['bloque']);
  11.         $a = explode(',', $datos[0]); //Paquetes
  12.         $b = explode(',', $datos[1]); //Países
  13.  
  14.         if (count($a) + count($b) == $total){
  15.             for ($i = 0, $l = count($a); $i < $l; $i++){
  16.                 echo 'Paquete: ' . $a[$i] . ' --- País: ' . $b[$i] . '<br />';
  17.             }
  18.         }
  19.     }
  20.     $resultado->free();
  21. }

Lo primero que hago es establecer los códigos de los países que, en tu caso, el usuario ha seleccionado de una lista desplegable. Enseguida, convierto al arreglo en una cadena para poder usar los datos en la consulta SQL, uniéndolos mediante comas. A continuación, calculo el total de elementos que debe haber en un grupo de paquetes y países. Tomando en cuenta el resultado que deseamos obtener:

Código Resultado:
Ver original
  1. idPais    idPaquete
  2. --------------------
  3.   4          201
  4.   4          203
  5.  73          201
  6.  73          203

Habrá ocho datos que serán agrupados. La cantidad es variable según la selección del usuario, por lo que esa fórmula servirá en todos los casos.

En la consulta SQL, concateno los grupos de paquetes y países separando a ambos grupos mediante un guion y luego agrupo todo por el código identificador de los paquetes (que es el dato que establece el agrupamiento que deseamos obtener).

Luego de ejecutar la consulta y verificar que haya registros encontrados (en este caso, los grupos), procedemos a recorrer el set de resultados, separando los grupos de paquetes y países agrupados a partir del guion existente, formándose así dos grupos que siguen siendo cadenas de caracteres, por lo que a continuación procedemos a separarlos a partir de las comas, obteniendo finalmente dos arreglos; uno de los paquetes y el otro de los países.

Por último, verifico que la suma de datos contenidos entre ambos arreglos sea igual al total establecido al inicio; de ser así, procedo a imprimir los datos respectivos, obteniendo un resultado similar al siguiente:
Código Resultado:
Ver original
  1. Paquete: 201 --- País: 4
  2. Paquete: 201 --- País: 73
  3. Paquete: 203 --- País: 4
  4. Paquete: 203 --- País: 73

__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Última edición por Alexis88; 14/07/2017 a las 10:18 Razón: Resultado

Etiquetas: campo, mysql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:18.