在编码的所有方面中,SQL是我最薄弱的技能,所以如果我听起来不知道我在说什么,请原谅我,因为我可能不知道!
情况:
构建一个购物车,其中名为“ cart”的表具有一个类型为VARCHAR 255的名为“ products”的字段,并且“ products”的值将是一个逗号分隔的字符串.字符串的每个元素都是一个数字,代表“产品”表中产品的ID.
客户的记录可能在“产品”字段中包含一个值,看起来像1,1,1,2,3.这意味着客户已添加了三个项目1,一个项目2,一个项目3.
问题:
因此,这是我目前拥有的sql语句,但是问题是我需要一个sql语句,该语句将返回product表中的重复产品数据:
SELECT product_id, product_name,price
FROM products
WHERE id in ('1','1','1','2','3')
结果将是“产品”表中的三个项目的集合1、2和3.换句话说,它不会给我三个“ 1”的产品数据,只会给我一个独特的价值.不是products表中的3个值,而是products表中的5个值,前三个结果相同,因为它们是相同的product_id = 1.
我需要一条sql语句,该语句将为我提供冗余的产品信息,因为毕竟,一个人可以订购三个具有product_id = 1的小部件.
大车:
id INT(15)
uid VARCHAR(32)
email VARCHAR(100)
products VARCHAR(255)
date DATETIME
checkout TINYINT(1)
产品:
id INT(15)
product_id varchar(32)
product_name varchar(128)
product_associations varchar(255)
short_description varchar(255)
long_description mediumtext
price varchar(32)
image varchar(128)
我的PHP代码:
$productslist = str_replace(",","','",$row->products);
$productslist = "'" . $productslist . "'"; echo $productslist;
$sql2 = "SELECT product_id, product_name,price FROM products WHERE id in ($productslist)";
$query2 = $this->db->query($sql2);
$i = 0;
if ($query2->num_rows() > 0){
foreach ($query2->result() as $row2){
$products[$i]['product_id'] = $row2->product_id;
$products[$i]['product_name'] = $row2->product_name;
$products[$i]['price'] = $row2->price;
$i++;
}
}
…此查询的结果将是:
Product ID: #0001
Product Name: "Ducky"
Price: $1.50
Product ID: #0002
Product Name: "Horse"
Price: $1499.00
Product ID: #0003
Product Name: "T-shirt"
Price: $5.00
更新:
为了最佳实践,我研究了“规范化”表理论,然后回滚了逗号分隔产品领域的上述方案.我创建了一个单独的表“ cart_list”,其中包含以下字段:
id
cart_id
product_id
…我只是为每个新的“添加到购物车”插入新记录,通过cart_id字段将其记录在购物车表中,并通过product_id字段将其记录在产品数据中.