Ver Mensaje Individual
  #7 (permalink)  
Antiguo 14/07/2017, 10:12
Avatar de Alexis88
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