2009-11-04 5 views
1

간단히 말해서, 단일 행 요소를 여러 열로 나누는 함수가 mysql에서 사용할 수 있습니까? 필드가있는 테이블 행이 있습니다. user_id, user_name, user_location.mysql에서 단일 행을 여러 열로 분할하는 방법

이 위치에서 사용자는 여러 위치를 추가 할 수 있습니다. 나는 위치를 imploding하고 PHP를 사용하여 단일 행으로 테이블에 저장하고 있습니다.

격자보기에서 사용자 레코드를 표시 할 때 user_locations를 분할하여 레코드를 표시하므로 페이지 매김에 문제가 있습니다. 그래서 user_locations (단일 행을 여러 열)로 분할해야합니다.

문자를 기준으로 레코드를 나누고 계산할 수있는 함수가 있습니까?

예를 들어 USER_LOCATION 내가 4 개 컬럼에이 기록을 나눌 수있는 방법

US%UK%JAPAN%CANADA 데. 카운트 값 (4)도 확인해야합니다. 미리 감사드립니다.

답변

2

먼저 분할 마지막에 %가 있습니다.

select replace(concat(user_location,'%'),'%%','%') as str 
from YourTable where user_id = 1 

그런 다음 트릭으로 항목 수를 계산할 수 있습니다. '%'를 '%'로 바꾸고 문자열에 추가 된 공백 수를 계산하십시오. 예를 들어 : SUBSTRING_INDEX를 사용

select length(replace(str, '%', '% ')) - length(str) 
    as LocationCount  
from (
    select replace(concat(user_location,'%'),'%%','%') as str 
    from YourTable where user_id = 1 
) normalized 

, 우리는 위치의 수에 열을 추가 할 수 있습니다 귀하의 예를 US%UK%JAPAN%CANADA를 들어

select length(replace(str, '%', '% ')) - length(str) 
    as LocationCount  
, substring_index(substring_index(str,'%',1),'%',-1) as Loc1 
, substring_index(substring_index(str,'%',2),'%',-1) as Loc2 
, substring_index(substring_index(str,'%',3),'%',-1) as Loc3 
from (
    select replace(concat(user_location,'%'),'%%','%') as str 
    from YourTable where user_id = 1 
) normalized 

이 인쇄 :

LocationCount Loc1 Loc2 Loc3 
4    US  UK  JAPAN 

그래서 당신은 그것을 할 수있는 참조 끝나면 문자열을 파싱하는 것이 SQL의 장점 중 하나가 아닙니다.

+0

감사를해야한다. 하지만 countof 위치가 1보다 큰 테이블은 – Paulraj

+0

테이블에 하나 이상있을 때만 반환됩니다. 지금 내 생각에 무슨 뜻인지 알 것 같습니다. 나는 대답을 편집 할 것이다. – Andomar

0

이 작업은 데이터베이스가 아닌 클라이언트 응용 프로그램에서 수행해야합니다.

SQL 쿼리를 만들 때 얻으려는 열을 정적으로 지정해야합니다. 즉, 실행하기 전에 결과 집합에 원하는 열을 DB에 알려야합니다. 예를 들어 datetime이 저장되어있는 경우 select month(birthday), select year(birthday) from ...과 같은 작업을 수행 할 수 있습니다.이 경우 생일 열을 다른 두 열로 나눕니다. 그러나이 열은 우리가 가질 열로 쿼리에 지정됩니다.

귀하의 경우에는

빈 위치를 제거하고 확인하고, 당신은 정확히 데이터베이스에서 해당 US%UK%JAPAN%CANADA 문자열을 얻을 것이다, 그리고 당신은 문자열을 정상화 즉

, 소프트웨어에서 나중에
/* get data from database */ 
/* ... */ 
$user_location = ... /* extract the field from the resultset */ 
$user_locations = explode("%", $user_location); 
0

이, 당신이 그것을 변경 할 수있는 경우,이 개 테이블의 데이터를 나쁜 디자인 저장되어

table users: id, name, surname ... 

table users_location: user_id (fk), location 

users_location이 USER_ID 필드 thorugh 사용자가 외부 키를 것

2

은 "옳은 일" 그 위치를 다른 테이블로 나눠서 그들 사이의 다 - 대 - 다 관계를 수립 할 수 있습니다.

create table users (
    id int not null auto_increment primary key, 
    name varchar(64) 
) 

create table locations (
    id int not null auto_increment primary key, 
    name varchar(64) 
) 

create table users_locations (
    id int not null auto_increment primary key, 
    user_id int not null, 
    location_id int not null, 
    unique index user_location_unique_together (user_id, location_id) 
) 

그런 다음 외래 키 (및 InnoDB 엔진) 또는 트리거를 사용하여 참조 무결성을 보장하십시오.

1

이 그것을 당신의 쿼리에 대한

DELIMITER $$ 

DROP PROCEDURE IF EXISTS `CSV2LST`$$ 

CREATE DEFINER=`root`@`%` PROCEDURE `CSV2LST`(IN csv_ TEXT) 
BEGIN 

SET @s=CONCAT('select \"',REPLACE(csv_,',','\" union select \"'),'\";'); 
PREPARE stmt FROM @s; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
END$$ 

DELIMITER ; 
관련 문제