2011-09-20 16 views
5

bien He buscado aquí por unos días, y encontré esto: Esto ha sido útil pero no ha funcionado para lo que estoy trabajando actualmente.Recepción de respuestas duplicadas cuando consulta una base de datos

Así que aquí es el alcance de las cosas que tengo 3 mesas diferentes

tabla 1 (cantidades) consisten en:

quantity_id int(11) auto_increment not null (primary key) 
product_id int(11) not null 
color_id int(11) not null 
size_id int (11) not null 
quantity int (11) not null 

la tabla 2 (colores) consisten en:

color_id int(11) auto_increment not null (primary key) 
color_name varchar(255) 

la tabla 3 (tamaños) consiste en:

size_id int (11) auto_increment not null (primary key) 
size varchar(255) 

SELECT s.size, c.color_name, q.quantity, q.size_id, q.product_id, q.color_id 
FROM quantities q, colors c, sizes s 
WHERE q.color_id = c.color_id 
AND q.size_id = s.size_id 
AND q.product_id = $pid 
GROUP BY q.color_id 
ORDER BY q.size_id 

$ pid es el ID del producto pasado por el formulario.

Cuando cargo de los resultados en 2 sentencias de selección diferentes: uno para el color, uno para el tamaño me sale múltiple del mismo color o tamaño:

red    s 
red    L 
yellow   L 

entiendo que es, literalmente, tirando de las filas fuera de la base de datos y mostrarlos, pero ¿cómo no me repito? ?

me han tratado esta consulta

SELECT s.size, c.color_name, q.quantity, q.size_id, q.product_id, q.color_id 
FROM quantities q LEFT JOIN colors c ON q.color_id = c.color_id 
LEFT JOIN sizes s ON q.size_id = s.size_id 
WHERE q.product_id = $pid 

¿Hay una mejor manera?

+1

¿Qué es exactamente lo que estás tratando de lograr? – Einacio

+0

Eso sería útil. ok el juego final aquí es que solo quiero rellenar los cuadros de selección con productos que tienen una cantidad de más de 1. No quiero mostrar colores múltiples de 'rojo', 'azul', ni quiero para mostrar múltiples tamaños 'S', 'L', etc partir de ahora puede aparecer rojo L S roja amarilla L S azul – alexis

Respuesta

0

Su pregunta no está nada clara, pero la consulta a continuación le dará información sobre el color, el tamaño y la cantidad con una identificación de producto mediante el uso de combinaciones.

actualiza con restricción Cantidad

SELECT size, color_name, quantity, sizes.size_id, colors.color_id 
FROM quantities 
    INNER JOIN colors ON quantities.color_id = colors.color_id 
    INNER JOIN sizes ON quantities.size_id = sizes.size_id 
WHERE product_id = ? and quantity > 1 
+0

Esto mantendrá mis selecciona de poblar con múltiples colores, tamaños? Simplemente mostrará Azul, Verde, Rojo una vez y S M L una vez – alexis

+0

Sí. Tiene una coincidencia uno a uno implementada para ambos colores y tamaños, ya que está almacenando esas claves en su tabla de cantidades. Esto debería obtener solo un color y un tamaño único para una identificación de producto determinada. –

+0

gracias por su ayuda – alexis

0

Usted está consiguiendo filas repetidos debido a que está recibiendo todas las combinaciones de color y tamaño. Me imagino que hay varios colores para el mismo tamaño, lo cual es normal. Si desea forzar la integridad, cambie la combinación izquierda para una unión interna para que solo obtenga registros que coincidan.

SELECT s.size, c.color_name, q.quantity, q.size_id, q.product_id, q.color_id 
FROM quantities q INNER JOIN colors c ON q.color_id = c.color_id 
INNER JOIN sizes s ON q.size_id = s.size_id 
WHERE q.product_id = $pid 

ACTUALIZACIÓN: Si sólo desea mostrar cantidades> = 1, entonces hacen esto:

SELECT s.size, c.color_name, q.quantity, q.size_id, q.product_id, q.color_id 
FROM quantities q INNER JOIN colors c ON q.color_id = c.color_id 
INNER JOIN sizes s ON q.size_id = s.size_id 
WHERE q.product_id = $pid and q.quantity>=1 

Si también sólo desea mostrar un color y un tamaño y la suma de todos Cant a continuación, hacer esto:

SELECT min(s.size) as size, min(c.color_name) as color, sum(q.quantity) as TotalQty 
FROM quantities q INNER JOIN colors c ON q.color_id = c.color_id 
INNER JOIN sizes s ON q.size_id = s.size_id 
WHERE q.product_id = $pid and q.quantity>=1 
+0

gracias Soy muy nuevo en este sitio, así que estoy tratando de explicar todo lo que puedo – alexis

+0

@alexis verifique mi actualización. – Icarus

+0

gracias también por su ayuda – alexis

0

Si sólo almacén Identificación y el nombre del color que podría muy bien ser una función php, por lo que no necesita una tabla de colores:

<?PHP 
function color($color) 
{ 
    $colors['red']=1; 
    $colors['blue']=2; 
    $colors['green']=3; 

    return $colors[$color]; 
} 
//example of usage 
    $sql ="... where `color`=".color($_POST['color'])." "; 
?> 

Además, dado que el tamaño es un valor pequeño (no es un gran texto, por ejemplo), entonces no necesita una tabla de tamaño en absoluto.Todo lo que necesita es un producto y una cantidad (mejor cambiarle el nombre a PRODUCT_INFO) tabla:

mysql_query(" 
CREATE TABLE `Product` (
    `product_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    `product_name` varchar(30) NOT NULL , 
    unique(`product_name`), 
    PRIMARY KEY (`product_id`) 
) ENGINE=InnoDB ROW_FORMAT=COMPACT;") 
or die(mysql_error()); 

mysql_query(" 
CREATE TABLE `Product_Info` (
    `product_id` INT UNSIGNED NOT NULL , 
    `color_code` char(3) NOT NULL , 
    `prod_col_size` varchar(15) NOT NULL , 
    `quantity` mediumint UNSIGNED NOT NULL , 
    PRIMARY KEY (`product_id`,color_code,prod_col_size), 
    CONSTRAINT `prod_id_FK` FOREIGN KEY (`product_id`) 
     REFERENCES `Product` (`product_id`) 
     ON DELETE CASCADE 
) ENGINE=InnoDB ROW_FORMAT=COMPACT;") 
or die(mysql_error()); 

Esto no es perfecta, pero la normalización ya choosed esta manera. Las consultas serán muy fáciles de esta manera. Molestarse con uniones largas en un esquema bien normalizado tiene sentido. Para molestar sin ninguna razón en absoluto !? Solo necesita hacer una combinación en dos tablas en caso de que necesite alguna archivada en la tabla de productos.

/*Find how many red items has a specific product*/ 

select sum(`Product_Info`.`quantity`) 
    from `Product_Info` where `color_code`='124' and `product_id`='3'; 
Cuestiones relacionadas