3

コーディングのすべての側面の中で、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 フィールドによって製品データにキー付けされます。

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 に答える