2012-11-25 3 views
0

외부 xml 파일의 모든 값을 저장하는 데이터베이스 테이블이 있습니다. 내 프로젝트 요구 사항은이 비표준 데이터를 처리하도록 요구하기 때문에. 적절한 방식으로 데이터를 추출하는 데 도움이 필요합니다.PHP를 사용하여 mysql에서 데이터 분해

나는 두 개의 웹 페이지 (카테고리의 하나)와 products.My 데이터베이스 테이블 하나가 다음과 같습니다

**product_id  Code  Name     ProductRange   ProductSubRange   WebCategory** 

    1    1002  Lid 30l     Crystal;Uni   LIDs     Household products 

    2    10433  Casa Basket Silver  Casa    Casa Hipster BASKET  Kitchenware 

    3    17443  Casa Basket Ice White Casa;Laundry   LAUNDRY BASKET   Laundry products 

    4    13443  Garden tub    Eden    Eden Garden Pots  Household products 

    5    199990  Black Lid 201   Crystal    Crystal Lids   Household products 

이상의 productRange에 속하는 제품 내 세미콜론 표시()를. 예를 들어, "립 301"이라는 이름의 product_id 1 위에는 두 개의 Product Range "Crystal"과 "Uni"가 속합니다. product_id 3에도 동일합니다. 그러나 product 2는 단일 ProductRange에 속합니다.

내 질문 :

1) 어떻게 그것을 "Webcategory"내 QUERY_STRING의 값에 따라 "ProductRange"를 반환 할 수 있도록 쿼리를 만들 수 있습니까? 예를 들면 : 나는 쿼리 문자열에서 내 WebCategory로 "가구 제품을"얻을 경우 는,이 같은 날 서로 다른 줄 수 : 추출 ProductRanges을 바탕으로

 Household Products 
         |-Crystal 
         |-Uni 
         |-Eden 

     Laundry Products 
         |-Casa 
         |-Laundry 

      Kitchenware 
         |-Casa 

2), 나는 별도로 제품을 표시 할 내 제품 범위 및 웹 카테고리에 따라 웹 페이지.

Household Products| 
        |-Crystal 
          |-Lid 301 (product_id=1) 
          |-Balck Lid 201 (product_id=5) 

        |-Uni 
          |-Lid 301 (product_id=1) 

        |-Eden 
          |-Garden Tub 


     Kitchenware| 
        |-Casa 
          |-Casa Basket silver 


    Laundry Products| 
        |-Casa 
          |-Casa Basket Ice White 
        | 
        |-Laundry 
          |-Casa Basket Ice White 

사람이 내가 데이터베이스에서 레코드를 검색 할 수있는 방법 나를 인도 할 수 있고 : 내가 선택한 위에서 "크리스탈"예를 들어, 각각이 같은 날 PRODUCT_ID "1"로 제품 및 "5"를 줄 수 내가 프로그래밍을 처음 접했을 때 내가해야 할 일은 무엇인가? 나는이 점에 관해 누군가가 나를 도울 수 있으면 감사 할 것이다.

+0

나는이 점에 대해 투표를 거부했지만, 필자는 그것이 필요하다고 동의했는지 확신 할 수 없었다. 기본적인 질문을 이해할 수있었습니다. SQL 쿼리가 여러 값을 가진 열을 구문 분석하기를 원했습니다. 이것은 많은 프로그래머에게 너무 일반적인 현실이기 때문에, 이전에 해보지 않았 으면 알아 내기가 어렵 기 때문에, 다음 게시물에 나오는 사람이 누가 그것을 검색하면 도움이되는 조언이있는 게시물을 찾을 수 있습니다. 그래서 나는 균형을 맞추기 위해 내 표를 던졌습니다. –

+0

@ JMHicks.IJMHicks.I 감사합니다. 여기에 문제가 있다면 일부 프로그래머가 동의하지 않거나 어쨌든 누군가가 당신을 도울 수 없다면, 그들은 간단히 질문에 투표합니다. 나는 이것이 일종의 실망 스럽다고 생각합니다. 질문자. 고마워. –

답변

2

주어진 WebCategory input = 'XYZ'에 따라 별개의 제품 범위를 얻으려면 다음을 사용할 수 있습니다. numberstable에 협박하지 마세요. 정수 값이 증가하는 행을 포함하는 유용한 테이블입니다. 1부터 ... N까지 N은 ProductRange 열의 최대 문자 수입니다. 이 손으로 만든 또는 여기에있는 것과 같은 특별한 삽입/선택 쿼리를 사용 할 수 있습니다 결과 집합을 검색하기 위해 http://www.experts-exchange.com/Database/MySQL/A_3573-A-MySQL-Tidbit-Quick-Numbers-Table-Generation.html

SELECT DISTINCT 
SUBSTRING(ProductRange FROM number FOR LOCATE(';', ProductRange, number) - number) AS ProductRange 
FROM ( 
    SELECT ProductRange, CASE number WHEN 1 THEN 1 ELSE number + 1 END number 
    FROM ( 
     SELECT mydatabasetable.ProductRange, numberstable.number 
     FROM mydatabasetable 
     INNER JOIN numberstable 
     ON numberstable.number >= 1 
     AND numberstable.number <= CHAR_LENGTH(mydatabasetable.ProductRange) 
     WHERE WebCategory = 'XYZ' 
    ) TT 
    WHERE number = 1 OR (number + 1) <= CHAR_LENGTH(ProductRange) 
) TT 
WHERE SUBSTRING(ProductRange FROM number FOR 1) = ';' 
OR numberstable.number = 1; 

을 귀하의 웹 사이트에 사용할 수있는 모든 값 WebCategory, ProductRange 및 제품 위의 쿼리에서 파생 된 약간 수정 된 버전입니다. 결과가 더 의미가있는 것처럼 보이기 위해 ORDER BY 절을 추가하여 모든 동일한 카테고리의 동일한 제품 범위 제품을 순차적으로 유지합니다. 이는 응용 프로그램/서버 스크립트 코드에서 그렇게하기를 원할 수도 있으므로 바람직하지 않을 수도 있습니다. 이 경우 아무런 해를 끼치 지 않고 ORDER BY 절을 제거 할 수 있습니다.

SELECT WebCategory, 
SUBSTRING( 
    ProductRange 
    FROM number 
    FOR LOCATE(';', ProductRange, number) - number 
) AS ProductRange, 
Product 
FROM ( 
    SELECT WebCategory, ProductRange, Product, 
    CASE number 
    WHEN 1 THEN 1 
    ELSE number + 1 
    END number 
    FROM ( 
     SELECT WebCategory, ProductRange, Product, numberstable.number 
     FROM mydatabasetable 
     INNER JOIN numberstable 
     ON numberstable.number >= 1 
     AND numberstable.number <= CHAR_LENGTH(ProductRange) 
    ) TT 
    WHERE number = 1 OR (number + 1) <= CHAR_LENGTH(ProductRange) 
) TT 
WHERE SUBSTRING(ProductRange FROM number FOR 1) = ';' 
OR numberstable.number = 1 
ORDER BY WebCategory, ProductRange, Product 
0

쿼리에 GROUP BY 절을 사용하려는 경우가 많으며 자세한 데이터가 다른 테이블에 있으면 JOIN을 수행 할 수 있습니다. 내가 너를 정확히 이해하면이게 닮았을거야.

SELECT T.WebCategory, T.ProductRange, T2.Product FROM table T 
INNER JOIN table2 T2 ON T2.ProductRange = T.ProductRange 
WHERE T.WebCategory = 'Household products' 
GROUP BY T.WebCategory, T.ProductRange, T2.Product 

은 테스트 할 데이터베이스 설정을하지 않고 내 쿼리를 테스트하기 힘든이지만, 위의 같은 당신이 찾고있는 무엇을 반환해야합니다. 물론 두 번째 테이블의 실제 이름을 기반으로 열의 이름을 바꿔야합니다. 전반적으로,이 질문을 올바르게 이해하면 시작해야합니다.

관련 문제