2017-04-13 19 views
0

私はテーブルがあります。SQL分割値

+---------------+---------------+-----+-------+ 
| id_order  | id_product  | qty | size | 
+---------------+----------------+-----+------+ 
| ORD-0413-17-1 | PRD-0408-17-2 | 2 | M | 
| ORD-0413-17-1 | PRD-0412-17-11 | 3 | S | 
+---------------+----------------+-----+------+ 

私はこれを行うことができます方法:

+---------------+------------------------------+-----+------+ 
| id_order  | id_product     | qty | size | 
+---------------+------------------------------+-----+------+ 
| ORD-0413-17-1 | PRD-0408-17-2,PRD-0412-17-11 | 2,3 | M,S | 
+---------------+------------------------------+-----+------+ 

を私はこのような出力を持っていたいですか?

+3

これは、PHPで行うことは可能だが、これは実際にどのようにデータベースにregardaring悪い​​習慣のようです構築されます。 – bestprogrammerintheworld

+2

これはMySQLで行うことができますが、あなたのデータは正規化のために叫ばれています。このようなCSVデータは保存しないでください。 –

+0

私はこれをPHPで行うことができますか? @bestprogrammerintheworld –

答えて

2

ここでは、 'データ'から正規化された '結果'を作成する方法の1つです...単純なユーティリティテーブルの整数(0〜9)を使用していますが、代わりにUNION 。私の場合は

DROP TABLE IF EXISTS my_table; 

CREATE TABLE my_table 
(id_order VARCHAR(20) NOT NULL 
,id_product VARCHAR(255) NOT NULL 
,qty VARCHAR(30) NOT NULL 
,size VARCHAR(30) NOT NULL 
); 

INSERT INTO my_table VALUES 
('ORD-0413-17-1','PRD-0408-17-2,PRD-0412-17-11','2,3','M,S'); 

DROP TABLE IF EXISTS ints; 

CREATE TABLE ints(i INT NOT NULL PRIMARY KEY); 

INSERT INTO ints VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); 

SELECT DISTINCT id_order 
       , SUBSTRING_INDEX(SUBSTRING_INDEX(id_product,',',i+1),',',-1) id_product 
       , SUBSTRING_INDEX(SUBSTRING_INDEX(qty,',',i+1),',',-1) qty 
       , SUBSTRING_INDEX(SUBSTRING_INDEX(size,',',i+1),',',-1) size 
      FROM my_table,ints; 


    id_order  id_product qty size 
    ORD-0413-17-1 PRD-0408-17-2 2 M 
    ORD-0413-17-1 PRD-0412-17-11 3 S 
+0

これは、エレガントでスムーズなソリューションであり、PHPでうまく調整することができます。 – Nineoclick

+0

@Nineoclick私は同意しません。 PHPは私には分かりません。 – Strawberry

+0

私が見ていることは、 "SELECT DISTINCT ..."を照会する前にid_productを調べて、カンマ区切りのid_productフィールドの最大sizeofを見つけ、十字形のsizeof値のように多くのintを "ints"に挿入することです参加する。 – Nineoclick

-1

、クラスのPHPでメソッドを使用しています、これはメソッドです:

public function user_checkout($params){ 

    $date = new DateTime(date('Y-m-d')); 
    $date->modify('+3 day'); 

    $query = "SELECT * FROM cart WHERE id_session='".$params['id_user']."'"; 
    $sql = $this->db->query($query); 
    $data1 = array(); 
    $data2 = array(); 
    $data3 = array(); 
    while($result = $sql->fetch_assoc()){ 

     $data1[] = $result['id_product']; 
     $data2[] = $result['qty']; 
     $data3[] = $result['size']; 

    } 

    $data_insert = array(
     "id_order" => $params['id_order'], 
     "id_product" => implode(',', $data1), 
     "id_user" => $params['id_user'], 
     "qty" => implode(',', $data2), 
     "size" => implode(',', $data3), 
     "account_name" => $params['name_of_account'], 
     "account_number" => $params['no_rekening'], 
     "amount" => $params['amount'], 
     "total_price" => $params['total_price'], 
     "out_of_date" => $date->format('Y-m-d'), 
     "order_date" => date('Y-m-d') 
    ); 

    $insert = "INSERT INTO `order_product`(`id_order`, `id_product`, `id_user`, `qty`,`size`, `account_name`, `account_number`, `amout`, `total_price`, `out_of_date`, `order_date`, `status`) VALUES ('".$data_insert['id_order']."','".$data_insert['id_product']."','".$data_insert['id_user']."','".$data_insert['qty']."','".$data_insert['size']."','".$data_insert['account_name']."','".$data_insert['account_number']."','".$data_insert['amount']."','".$data_insert['total_price']."','".$data_insert['out_of_date']."','".$data_insert['order_date']."',0)"; 
    $sql_insert = $this->db->query($insert); 

    $delete = "DELETE FROM cart WHERE id_session = '".$params['id_user']."'"; 
    $sql_delete = $this->db->query($delete); 

    return true; 

}