【问题标题】:Receiving duplicate answers when query a database查询数据库时收到重复的答案
【发布时间】:2011-09-20 15:10:03
【问题描述】:

好的,我已经在这里看了几天了,我确实找到了这个: 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 个不同的选择语句中时:一个用于颜色,一个用于大小 我得到多个相同颜色或大小的:

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

有没有更好的办法?

【问题讨论】:

  • 您到底想要完成什么?
  • 那会很有帮助。好的,这里的最终游戏是我只想用数量超过 1 的产品填充选择框。我不想显示“红色”、“蓝色”的多种颜色,也不想显示多种尺寸'S','L'等现在可以显示红色L红色S黄色L蓝色S

标签: php mysql


【解决方案1】:

您的问题有点不清楚,但下面的查询将通过使用联接在给定产品 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

【讨论】:

  • 这将使我的选择不会填充多种颜色、尺寸?它只会显示一次蓝色、绿色、红色和 S M L 一次
  • 是的。由于您将这些键存储在数量表中,因此您为颜色和尺寸实现了一对一的匹配。对于给定的产品 ID,这应该只会为您提供一种颜色和一种尺寸。
  • 没问题 :) 如果你帮助了你,请务必接受答案。
【解决方案2】:

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

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

【讨论】:

  • 感谢我是这个网站的新手,所以我会尽力解释一切
【解决方案3】:

如果你只存储颜色的 id 和 name 它很可能是一个 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'])." "; 
?>

此外,由于尺寸是一个很小的值(例如不是大文本),所以您根本不需要尺寸表。您只需要一个产品和一个数量(最好将其重命名为 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';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-15
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 2014-09-23
    • 1970-01-01
    相关资源
    最近更新 更多