데이터베이스 테이블 구현이 좋지 않은 것 같지만, 필요한 경우 GROUP_CONCAT의 역 기능이 될 수 있지만 불행히도 MySQL에는 존재하지 않습니다.
두 가지 가능한 솔루션이 있습니다
- 변경하면 데이터를 저장하는 방식에서 쿼리 결과를 조작합니다 (
product_id
필드에서 중복을 허용하고 다른 category_id
에 대해 동일한 product_id
여러 기록을 넣어)
- 을 귀하의 응용 프로그램 (귀하의 질문에 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 |
+-----+-----+
그것은 당신을위한 출발점이 될 수 ...
왜 절약 category_ids 쉼표로 구분된다? 정규화 된 형식이 아닙니다. 원하는 결과 구조가 있어야합니다. –
이것은 거의 다음 질문과 똑같은 내용입니다 : http://stackoverflow.com/questions/10293861/split-comma-seperated-values-in-column-mysql/10294021#10294021 –
또 다른 질문은 정확한 복제입니다 : http : //stackoverflow.com/questions/4890968/comma-seperated-value-seperation –