2017-10-02 3 views
1

SQL 쿼리를 작성하는 데 매우 익숙합니다. 프런트 엔드 애플리케이션에 차트를 생성하려고하지만 데이터를 조작하여 프런트 엔드를 생성해야하므로 복잡한 쿼리를 실행하는 데는 적합하지 않습니다.phpMyAdmin에서보기를 위해 열을 3 열로 나누는 Mysql

여기에 내 현재 상황이 있습니다 : 레코드가 생성 된 날짜와 클라이언트 데이터가있는 테이블이 있습니다. 다음은 특정 순서가 아닌 샘플입니다.

| ID | post_date | post_title | 
------------------------------------------- 
| 1654 | 2017-09-04 | Bill Smith (5678)| 
| 1658 | 2017-09-05 | Jan Jones (3423) | 
| 1878 | 2017-08-17 | Jim Tanz (7890) | 
| 1659 | 2017-09-06 | Jan Jones (3425) | 

나는 고유 한 값을 성으로 표시하고 싶지만, 현재 모든 이름은 하나의 열에 있습니다. ID는 각 레코드마다 증가하므로 괄호 안의 숫자 (트랜잭션 ID)는성에 추가되어 고유하며, 이름을 가져 오는 다른 응용 프로그램에서 가져옵니다.

나는 post_title 열을 분할 할 수 있었지만 2 열로 만 갈 수 있었지만 FName과 성 (TrID)으로 남았는데, 이는 클라이언트 수를 계산하기 위해 마지막으로 별개의 항목을 선택하지 못하게합니다. TrID는 모두 다릅니다.

내 의도는 3 개의 열이있는보기를 작성한 다음 성별로 별개의 항목을 표시하고 매월 고객이 증가했는지 확인하기 위해 매월 클라이언트를 계산했지만 아직 초기 단계입니다.

도움을 주시면 대단히 감사하겠습니다 (영원히 기억하실 것 :>) 고마워요!

+0

표시 할 내용을 자세히 설명 할 수 있습니까? 각성에 대해 성을 표시하거나 성으로 그룹화하거나 단순히 post_title을 세 개의 필드 (이름, 성, id)로 나누는 등 모든 고유 한 성을 찾고 있는지 파악할 수 없습니다. .....또는 다른 것! –

+0

Chris에게 감사드립니다. 텍스트를 firstName | lastName | post_ID | – Bonus21

답변

0

일부 텍스트 작업과는 작동 할 수 있습니다

SELECT t.post_title 
     ,LEFT(t.post_title, LOCATE(' ', post_title)) AS FName 
     ,SUBSTR(t.post_title, LOCATE(' ', post_title)+1, LOCATE(' ',post_title,LOCATE(' ', post_title)+1)-LOCATE(' ', post_title)) AS LName 
     ,REPLACE(REPLACE(TRIM(RIGHT(t.post_title,LOCATE(' ', REVERSE(post_title)))), '(', ''), ')','') AS ID 
FROM (SELECT 'Bill Smith (5678)' AS post_title 
     UNION SELECT 'Jan Jones (3423)' 
     UNION SELECT 'Jim Tanz (7890)') t; 

Rextester Demo

0

당신은 그래서 이름 검색 문자열을 분리 SUBSTRING_INDEX를 사용할 수 있습니다

SUBSTRING_INDEX(post_title," ",1) 

이를 공간의 n 번째 인스턴스가 될 때까지 모든 것을 가져옵니다. 그래서 성을 얻기 위해 좀 더 지저분합니다. g '2'우리는 두 번째 공간까지 값을 가져올 것입니다. 그런 다음 두 번째 값을 추출해야합니다 (역순으로 -1). 세 개의 필드로 post_title 분할 : 1

SUBSTRING_INDEX(SUBSTRING_INDEX(post_title," ",2)," ",-1) 

시나리오 : 그러므로, '성'을 사용하여 수행하기

SELECT 
SUBSTRING_INDEX(post_title," ",1) as firstName, 
SUBSTRING_INDEX(SUBSTRING_INDEX(post_title," ",2)," ",-1) as lastName, 
SUBSTRING_INDEX(REPLACE(REPLACE(post_title,"(",""),")","")," ",-1) as post_ID 
FROM tableName; 

출력 :

+-----------+----------+---------+ 
| firstName | lastName | post_ID | 
---------------------------------+ 
| Bill  | Smith | 5678 | 
| Jan  | Jones | 3423 | 
| Jim  | Tanz  | 7890 | 
| Jan  | Jones | 3425 | 
+-----------+----------+---------+ 

시나리오 2 : 그룹화 기능

는 또한 성을 기준으로 그룹 카운트에 지정된 필드를 사용할 수

SELECT 
COUNT(*) as Qty, 
SUBSTRING_INDEX(SUBSTRING_INDEX(post_title," ",2)," ",-1) as lastName 
FROM tableName 
GROUP BY lastName; 

출력 :

+-----+----------+ 
| Qty | lastName | 
+-----+----------+ 
| 2 | Jones | 
| 1 | Smith | 
| 1 | Tanz  | 
+-----+----------+ 

등등. 당신이하려는 일을 충분히 확신 할 수 없기 때문에 이것을 더 이상 맞추기는 힘듭니다.하지만 위의 내용은 유용 할 것입니다.

+0

Chris에게 감사드립니다 - 이것은 훌륭하며 정말 도움이 될 것입니다 !! – Bonus21