Ver Mensaje Individual
  #2 (permalink)  
Antiguo 21/04/2011, 10:23
Avatar de HackmanC
HackmanC
 
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: seleccionar elementos de un arreglo que coincidan con un campo de una tabl

Hola,

He visto muchas veces este tipo de programación aquí en foros del web, y me voy a tomar la molestia de explicar detenidamente como se hace :), porque al parecer ya son bastantes los que desarrollan aplicaciones de esta forma y posiblemente te va a ser de utilidad,

Supongamos que tenemos este diagrama, una tabla maestra y una tabla de detalle, aunque evidentemente 'categories_name' esta repetida en las dos tablas, pero traté de apegarme lo más posible a tu diseño.



Con esta estructura,

Código MySQL:
Ver original
  1. CREATE SCHEMA IF NOT EXISTS `categories` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ;
  2. USE `categories` ;
  3.  
  4. CREATE  TABLE IF NOT EXISTS `categories`.`categories` (
  5.   `categories_id` INT NOT NULL ,
  6.   `categories_name` VARCHAR(45) NULL ,
  7.   PRIMARY KEY (`categories_id`) )
  8.  
  9. CREATE  TABLE IF NOT EXISTS `categories`.`categories_description` (
  10.   `categories_id` INT NULL ,
  11.   `categories_name` VARCHAR(45) NULL ,
  12.   `categories_description` VARCHAR(45) NULL ,
  13.   INDEX `fk_categories_description_categories` (`categories_id` ASC) ,
  14.   CONSTRAINT `fk_categories_description_categories`
  15.     FOREIGN KEY (`categories_id` )
  16.     REFERENCES `categories`.`categories` (`categories_id` )

Cuando quieres extraer todos los registros de la tabla primaria (maestra) y después extraer los registros de la tabla relacionada (detalle), normalmente lo haces en un solo Query, salvo en casos excepcionales donde no es posible,

Código PHP:
<body>
<?php
$conn 
mysql_connect('localhost''root''PASSWORD');
mysql_select_db('categories');

$strSQL '
SELECT a.`categories_id`, a.`categories_name`, b.`categories_description`
FROM `categories` a
INNER JOIN `categories_description` b
ON a.`categories_id` = b.`categories_id`
ORDER BY a.`categories_id`
'
;

$result mysql_query($strSQL$conn);
if (
mysql_num_rows($result) == 0) {
    echo 
'<h1>No hay datos</h1>';
} else {
    
$i 0;
    while ((
$row mysql_fetch_assoc($result)) != NULL) {
        if (
$i != $row['categories_id']) {
            
$i $row['categories_id'];
            echo 
"<h1>Cateogiria : $i {$row['categories_name']}</h1>";
        }
        echo 
"<p>Titulo : {$row['categories_description']}</p>";
    }
}

mysql_free_result($result);
mysql_close($conn);
?>
</body>
Cual es el problema, estadísticas; por ejemplo, tienes 5 categorías, cada categoría tiene 5 productos o descripciones, si haces una consulta por cada producto o descripción, estas haciendo 6 consultas a la base de datos. Una para sacar las categorías y 1 por cada categoría. Ahora multiplica eso por 5 usuarios de tu programa, son 30 consultas consecutivas o concurrentes a la base de datos, si ya sé que no es mucho, cuando tengas 100 categorias y 1000 usuarios entonces me cuentas como te va.

En este ejemplo solamente se hace 1 consulta a la base de datos por usuario, aunque traiga alguna información repetida es mucho mas eficiente que 6 consultas consecutivas.

Saludos,

Última edición por HackmanC; 21/04/2011 a las 10:42 Razón: cálculos y quitar mi password :)