コーディングのすべての側面の中で、SQL は私の最も苦手なスキルです。そのため、何を話しているのかわからないように聞こえる場合は、ご容赦ください。
状況:
「cart」という名前のテーブルに VARCHAR 255 型の「products」という名前のフィールドがあり、「products」の値がカンマ区切りの文字列になるショッピング カートを作成します。文字列の各要素は、「products」テーブルの製品の ID を表す数値になります。
顧客のレコードの「製品」フィールドに、1,1,1,2,3 のような値が含まれている場合があります。これは、顧客がアイテム 1 を 3 つ、アイテム 2 を 1 つ、アイテム 3 を 1 つ追加したことを意味します。
問題:
だから、これが私が現在持っているSQLステートメントですが、問題は製品テーブルから繰り返し製品データを返すSQLステートメントが必要なことです:
SELECT product_id, product_name,price
FROM products
WHERE id in ('1','1','1','2','3')
その結果、「products」テーブルの 1 と 2 と 3 の 3 つのアイテムのセットになります。つまり、3 つの「1」の製品データは得られず、個別の値しか得られません。 . products テーブルからの 3 つの値ではなく、products テーブルからの 5 つの値で、最初の 3 つの結果は同一です。なぜなら、それらは同じ product_id=1 であるためです。
冗長な製品情報を提供する SQL ステートメントが必要です。結局のところ、1 人は product_id = 1 で 3 つのウィジェットを注文できるからです。
カート:
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 フィールドによって製品データにキー付けされます。