2017-04-13 96 views
0

我有表:SQL拆分值的多个列

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

我想有一个像这样的输出:

+---------------+---------------+-----+-------+ 
| 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 | 
+---------------+----------------+-----+------+ 

我怎么能这样做呢?

+3

这有可能在PHP做的,但是这确实似乎是一个不好的做法regardaring如何数据库建成。 – bestprogrammerintheworld

+2

你可以在MySQL中做到这一点,但你的数据正在尖叫出来进行规范化。不要像这样存储CSV数据。 –

+0

我如何使用php来做到这一点? @bestprogrammerintheworld –

回答

2

这里有一种方法来从你的'数据'中建立一个规范化的'结果'...我使用一个简单的整数表(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以查找splited-by-comma id_product字段的最大大小,然后将其插入“ints”中与crossof的sizeof值一样多的整数加入。 – 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; 

}