2012-01-07 2 views
4
을 분리

가능한 중복 : 내 PHP 프로젝트에서
Split string in SQL
Searching a column with comma seperated valuesSQL 쿼리는 열

나는 SQL을 작성하는 문제에 직면하고있어 :

나는 테이블이 "consulta 국세청 필드 "카테고리 같은 값이 :

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
+ id | consultant_name | categories       + 
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
+ 1 | AOAOAO   | health,insurance,programming,  + 
+ 2 | BOBOBO   | health,gaming,windows,mobile,  + 
+ 3 | CCCCCC   | insurance,windows,     + 
+ 4 | DDDDDD   | mobile,        + 
+ . | ......   | ............       + 
+ . | ......   | ............       + 
+ . | ......   | ............       + 
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 

그리고 내가 가진 컨설턴트가 등록 할 수있는 모든 종류 포함 된 배열을. 내가 원하는 무엇

$arrayOfCategories = $array("health","insurance","programming", 
          "sports","gaming","windows","apple", 
          "mobile","astrology"); 

나에게 같은 출력 제공해야 SQL 쿼리입니다 : 사전에

+++++++++++++++++++++++++++++++ 
+ category  | occurrence +  
+++++++++++++++++++++++++++++++ 
+ health  | 2   + 
+ insurance  | 2   + 
+ programming | 1   + 
+ sports  | 0   + 
+ gaming  | 1   + 
+ windows  | 2   + 
+ apple   | 0   + 
+ mobile  | 2   + 
+ astrology  | 0   + 
+++++++++++++++++++++++++++++++ 

도움의 모든 종류가 이해할 수있을 것이다 ...

감사합니다 ..

+8

이것이 잘못된 데이터베이스 디자인이라고 불리는 것입니다. –

+0

@ ShaktiSingh : 예, 그렇습니다. 그러나 변경 사항이 마지막에 요청 된 경우 수행 할 작업. – PhpStudent

+0

['GROUP_CONCAT()'] (http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat)의 반대편을 찾고 있습니다. – hakre

답변

2

나쁜 데이터베이스 설계하지만 흥미로운 질문은 여기있다 (PHP 코드)를 할 수있는 길입니다 :

$arrayOfCategories = $array("health","insurance","programming", 
          "sports","gaming","windows","apple", 
          "mobile","astrology"); 

$count = count($arrayOfCategories); 
$query = ""; 
for($i = 0; $i < $count; $i++) 
{ 
    $value = $arrayOfCategories[$i]; 
    $query += "SELECT '$value' AS category, 
       COUNT(*) AS occurrence 
       FROM consultants 
       WHERE FIND_IN_SET('$value', categories)"; 
    if($i < $count -1) { 
    $query += " UNION " 
    } 


} 

생성 된 쿼리의 결과 당신이 원하는 것을 정확하게 줄 수 있어야합니다. 자주 나쁜 디자인에서 흥미로운 질문이 온다 ... :)

+0

고마워요, 제가 원한대로 완벽하게 작동하고 있습니다. :) – PhpStudent

1

이것은 잘못된 데이터베이스 디자인입니다. 만약 내가 그 일에 매달렸다면, 나는 SQL을 사용하여 그 사건을 얻으려고하지는 않을 것이지만 나의 응용 프로그램을 사용하려고한다.

$ occurence라는 새 배열을 만들면 각 단어와 개수의 색인이 생성됩니다. 모든 행을 선택하고 쉼표로 범주 내용을 분할하십시오. 결과 배열을 반복하고 모든 단어에 대해 증가시킵니다. 당신이 어떤 mispelled 카테고리를 찾을 수 및 SQL을 업데이트 할 필요가 없습니다 것입니다이 방법의 장점

my %occurrence; 

while (my ($categories) = $sth->fetchrow_array()){ 

    my @cats = split(',', $categories); 

    foreach my $c (@cats){ 
     $occurrence{$c}++; 
    } 

} 

하나 :

나는 PHP에서 약간 녹슨 그래서 여기에 펄 내 제안이다 해요 새로운 카테고리가 추가되면 당신이 범주에있는 테이블을 가지고 있다면

0

,이 같은 그것을 할 수 :

SELECT cat.name, COUNT(*) 
FROM categories cat JOIN consultants con ON con.categories LIKE '%'+cat.name+'%' 

을하지만 나는이 어색 고려하고 매핑 테이블이 consultant-을 위해 거기 수 있도록 당신은 DB 체계를 정상화 고려해야한다 카테고리 관련

+0

한 범주가 다른 범주의 하위 문자열 인 경우 쿼리가 실패합니다. – voidengine

+0

'%', + cat.name + ', %''와 같지 않으며 'con.categories'에 쉼표 양쪽 끝에서. – Ben

+0

@ 벤 나는 어쨌든이 일이 영리한 일이 아니므로 나는 성가 시게 가치 있다고 생각하지 않는다. ... – voidengine