在编码的所有方面,SQL 是我最薄弱的技能,所以如果我听起来我不知道我在说什么,请原谅我,因为我可能不知道!
情况:
构建一个购物车,其中名为“cart”的表有一个类型为 VARCHAR 255 的名为“products”的字段,“products”的值将是一个逗号分隔的字符串。字符串的每个元素都是一个数字,代表“产品”表中产品的 ID。
客户记录的“产品”字段中可能包含一个类似于 1、1、1、2、3 的值。这意味着客户添加了第 1 项中的三个、第 2 项中的一项和第 3 项中的一项。
问题:
所以,这是我目前拥有的 sql 语句,但问题是我需要一个 sql 语句,它将从产品表中返回重复的产品数据:
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 字段键入产品数据。