2013-06-01 1 views
0

분명히 간단한 검색 스크립트에서 몇 가지 문제점에 직면하고 있습니다.MySQL 자체 내부 결합 및 seaching

id_product | name_product | has_choice | choice_id 
2   Coca-Cola  1   0 
3   Fanta   0   2//the id_product of Coca-Cola 
4   Sprite   0   2//the id_product of Coca-Cola 

내가 뭘 내부가 (합치 광고 등) 조인 후 acheive 할 것은 이것이다 : 제품의 ID가 preveious 선택 아이디의 아칸소

id_product | name_product   | has_choice | choice_id 
3   Coca-Cola of Fanta  0   2 
4   Coca-Cola of Sprite  0   2 

공지 사항 나는 folowing MySQL의 테이블 구조를 가지고있다. 또한 주요 제품 (해당 선택 사항은 생략되었습니다). 또한 has_choice 열은 제품에 선택 사항이 있거나 없음을 나타냅니다. 이 작업이 끝나면 결과 요소를 간단히 검색합니다. 나는이 문제에 대해 이틀 동안 고심하고있다. 누구든지이 문제에서 나를 도울 수 있습니까? 나는 고맙게 여길 것이다. 감사.

답변

1

는 당신은 아마 코카콜라 그 반대의 환타 의미했다. 특정 경우 INNER JOIN

SELECT p.id_product, 
     CONCAT(p.name_product, ' of ', p1.name_product) name_product, 
     p.has_choice, 
     p.choice_id 
    FROM products p JOIN products p1 
    ON p.choice_id = p1.id_product 

참고 상위 제품 선택 제품을 얻을 수 has_choice에서 필요가 없습니다.

출력 : 여기에

| ID_PRODUCT |  NAME_PRODUCT | HAS_CHOICE | CHOICE_ID | 
------------------------------------------------------------- 
|   3 | Fanta of Coca-Cola |   0 |   2 | 
|   4 | Sprite of Coca-Cola |   0 |   2 | 

SQLFiddle 데모입니다.

UPDATE1 모든 제품의 목록을 얻으려면 제품을 선택하거나 LEFT JOIN을 사용해야합니다. 제품 이름을 검색하려면 상위 제품과 선택 항목 모두 WHERE 절의 테이블 별칭을 사용하십시오. 해당 쿼리에

SELECT p.id_product, 
     CASE WHEN p1.id_product IS NULL THEN 
      p.name_product 
     ELSE 
      CONCAT(p.name_product, ' of ', p1.name_product) 
     END name_product, 
     p.has_choice, 
     p.choice_id 
    FROM products p LEFT JOIN products p1 -- use LEFT JOIN here 
    ON p.choice_id = p1.id_product 
WHERE p.has_choice = 0     -- filter out parent products 
    AND (p.name_product LIKE '%a%'  -- search in product name 
     OR 
     p1.name_product LIKE '%a%') -- search in product name of a parent product 

CASE

은 선택하지 않은 제품에 대한 일반 제품 이름을 가질 수 있습니다.

출력 : 여기에

| ID_PRODUCT |  NAME_PRODUCT | HAS_CHOICE | CHOICE_ID | 
------------------------------------------------------------- 
|   3 | Fanta of Coca-Cola |   0 |   2 | 
|   4 | Sprite of Coca-Cola |   0 |   2 | 
|   5 |    Axion |   0 |   0 | 

SQLFiddle 데모입니다.

+0

감사합니다. 그것은 worikng를 얻었다. 그러나 지금 im는 새로운 문제에 직면하고있다. 나는 새로 연결된 이름을 검색 할 수 없다 ... –

+0

@VictorBojica 당신은 환영합니다 : 어떤 종류의 검색을하려고하는지 설명해주십시오. – peterm

+0

또한 내가 가지고 있지 않은 제품을 가지고 있다면, 그들은 표시되지 않습니다. ( –

0

테이블 자체에 가입해야합니다.

이 시도 :

SELECT id, CONCAT(table.name_product, ' of ', table2.name_product), table.has_choice, table.choice_id 
FROM table 
JOIN table ON (table.id_product = table.choice_id) AS table2 
2

이 쿼리 should do it합니다. 만약 내가 제대로 이해하고

SELECT t1.id_product, 
     Concat(Concat(t2.name_product, ' of '), t1.name_product) AS 
     `name_product`, 
     t1.has_choice, 
     t1.choice_id 
FROM tbl1 AS t1 
     JOIN tbl1 AS t2 
     ON t1.choice_id = t2.id_product;