查询数据库时接收重复的答案

时间:2011-09-20 15:10:04

标签: php mysql

好的,我已经在这里看了几天,我确实发现了这个: MySQL GROUP BY two columns 这很有帮助,但对我目前正在进行的工作没有用。

所以这里是我有3个不同表格的范围

表1(数量)包括:

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

表2(颜色)包括:

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

表3(尺寸)包括:

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是表单传递的产品ID。

当我将结果加载到2个不同的select语句中时:一个用于颜色,一个用于大小 我得到了相同颜色或大小的多个:

red             s
red             L
yellow          L

我知道它实际上是从数据库中拉出行并显示它们,但是如何 我不重复自己吗?

我试过这个查询

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

有更好的方法吗?

3 个答案:

答案 0 :(得分:0)

您的问题有点不清楚,但下面的查询会通过使用连接为您提供产品ID的颜色,大小和数量信息。

已更新数量约束

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

答案 1 :(得分:0)

您正在获得重复的行,因为您获得了颜色和大小的所有组合。我想有相同大小的几种颜色,这是正常的。如果要强制完整性,请将左连接更改为内连接,以便只获取具有匹配项的记录。

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

更新:如果您只想显示数量> = 1,请执行以下操作:

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

如果您只想显示一种颜色和一种尺寸以及所有数量的总和,请执行以下操作:

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

答案 2 :(得分:0)

如果你只存储颜色的id和名称,它很可能是一个php函数,所以你不需要颜色表:

<?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'])." "; 
?>

此外,由于size是一个较小的值(例如,不是一个大文本),因此您根本不需要大小表。您只需要一个产品和数量(更好地将其重命名为product_info)表:

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());

这不是完美的规范化,但你已经选择了这种方式。通过这种方式查询将非常简单。在一个良好规范化的模式中加入长连接是有道理的。无缘无故地打扰!?您只需要在两个表中进行连接,以防您需要从产品表中提交一些文件。

    /*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';