3

在编码的所有方面,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 字段键入产品数据。

4

1 回答 1

3

有点难看,但这可以解决问题:

create temporary table t (id integer);
insert into t(id) values (1),(1),(2),(2),(3);


select product_id, product_name,price from t inner join products where t.id = products.id;

drop table t;
于 2013-08-22T00:46:55.017 回答