2012-06-19 6 views
2

MySQL. 두 개의 컬럼, 같은 테이블.
1 열
열 2 category_ids이 PRODUCT_ID있다 (가끔 2 종류를, 그래서 23,43 모양을)

이 어떻게 별도의 행하다면, PRODUCT_ID, category_ids의 목록을 반환하는 쿼리를 작성하려면 어떻게해야합니까이 product_id와 연결된 category_id가 두 개 이상입니다.
쉼표는 결과에서 한 열에서 두 행으로 값을 분리합니다. MySQL


표 :

product_id | category_ids 
100  | 200,300 
101  | 201 

쿼리 결과 : 실제로 원치 않는 (주) : 테이블을

100 | 200 
100 | 300 
101 | 201 


편집을 수정하려고하지 테이블을 조작하는 것. 그냥 PHP에서 쿼리를 수행하므로 필요에 따라 데이터를 사용할 수 있습니다.

+0

왜 절약 category_ids 쉼표로 구분된다? 정규화 된 형식이 아닙니다. 원하는 결과 구조가 있어야합니다. –

+0

이것은 거의 다음 질문과 똑같은 내용입니다 : http://stackoverflow.com/questions/10293861/split-comma-seperated-values-in-column-mysql/10294021#10294021 –

+0

또 다른 질문은 정확한 복제입니다 : http : //stackoverflow.com/questions/4890968/comma-seperated-value-seperation –

답변

1

데이터베이스 테이블 구현이 좋지 않은 것 같지만, 필요한 경우 GROUP_CONCAT의 역 기능이 될 수 있지만 불행히도 MySQL에는 존재하지 않습니다.

두 가지 가능한 솔루션이 있습니다

  1. 변경하면 데이터를 저장하는 방식에서 쿼리 결과를 조작합니다 (product_id 필드에서 중복을 허용하고 다른 category_id에 대해 동일한 product_id 여러 기록을 넣어)
  2. 을 귀하의 응용 프로그램 (귀하의 질문에 PHP 언급),이 경우 category_ids 열 값을 분할하고 자신의 결과 집합을 조립해야

이 저장 프로 시저 선언 당신이 먼저 (임시 테이블과 저장 프로 시저를 사용) 마술처럼 내가 찾은 세 번째 솔루션도있다 : 당신이 전화를해야 그 다음

DELIMITER $$ 
CREATE PROCEDURE csv_Explode(sSepar VARCHAR(255), saVal TEXT) 
body: 
BEGIN 

    DROP TEMPORARY TABLE IF EXISTS csv_Explode; 
    CREATE TEMPORARY TABLE lib_Explode(
    `pos` int unsigned NOT NULL auto_increment, 
    `val` VARCHAR(255) NOT NULL, 
    PRIMARY KEY (`pos`) 
) ENGINE=Memory COMMENT='Explode() results.'; 

    IF sSepar IS NULL OR saVal IS NULL THEN LEAVE body; END IF; 

    SET @saTail = saVal; 
    SET @iSeparLen = LENGTH(sSepar); 

    create_layers: 
    WHILE @saTail != '' DO 

    # Get the next value 
    SET @sHead = SUBSTRING_INDEX(@saTail, sSepar, 1); 
    SET @saTail = SUBSTRING(@saTail, LENGTH(@sHead) + 1 + @iSeparLen); 
    INSERT INTO lib_Explode SET val = @sHead; 

    END WHILE; 

END; $$ 
DELIMITER ; 

CALL csv_explode(',', (SELECT category_ids FROM products WHERE product_id = 100)); 

을이 후에는이 방법으로 임시 테이블에 결과를 표시 할 수 있습니다 :

SELECT * FROM csv_explode; 

그리고 결과 집합을 열에 배열을 통과하는 절차는 폭발 할 될 것입니다 :

+-----+-----+ 
| pos | val | 
+-----+-----+ 
| 1 | 200 | 
| 2 | 300 | 
+-----+-----+ 

그것은 당신을위한 출발점이 될 수 ...

+0

dev가이 기능을 사용하여 이전에 비슷한 기능을 구현했습니다 (단, 번역 및 사용 방법을 모르겠습니다. 다시) LEFT C isc_product_variation_combinations AS SELECT FROM p.prodname, c.combinationid, CONCAT (o.voname) CONCAT (vovalue) 는 FIND_IN_SET (o.voptionid ON O AS isc_product_variation_options, c.vcoptionids) LEFT isc_products 가입은 가입 AS p ON p.productid = c.vcproductid 여기서 c.vcproductid = 255 – jason3w

+0

이것은 몇 가지 테이블의 데이터를 결합하는 것이 었습니다. 그래서 하나의 테이블로는 꽤 쉽다는 생각이 들었습니다. – jason3w

+0

게시 한 쿼리가 다른 두 테이블을 조인했습니다. 이 경우 하나의 ID를 가진 테이블이 있고 FIND_IN_SET 함수를 사용하여 그 열과 결합합니다 ... – aleroot

관련 문제