2017-11-15 14 views
0

SQL을 사용하여 간단한 검색 기능을 사용하고 있습니다. GROUP_CONCAT을 사용하여 모든 키워드를 단일 행에 넣습니다. 키워드는 카테고리에서 가져옵니다.mysql에서 일치하는 위치와 그룹 연결

이 예에서는 일부 열이있는 것은 아닙니다. 나는

SELECT 
    p.id as id, 
    p.title as title, 
    p.title as company, 
    GROUP_CONCAT(DISTINCT cat.title SEPARATOR " ") as keywords, 
    FROM products p 
    JOIN product_categories pc ON p.id = pc.product_id 
    JOIN categories cat ON pc.category_id = cat.id 
    JOIN companies co ON p.company_id = co.id 
WHERE MATCH (p.title) AGAINST ("Test") 
OR MATCH (co.title) AGAINST ("Test") 
GROUP BY p.id 

keywordskeyword1 keyword2 keyword3 같은 것을 포함 아래로 박탈했습니다.

위의 SQL이 작동합니다. 그러나 가상 값 keywords 값을 갖는 MATCH AGAINST를 사용할 수 없습니다.

내가 못생긴 해결 방법이 무엇인지 내 생각에 대해 읽은

이를 추가합니다 :

HAVING keywords LIKE "%keyword1%" 

LIKE 아마 느리고있는 것은 GROUP 후이기 때문에 내가 사용하는 정도에 HAVING 수 없습니다에 의해 이 경우는 WHERE를 대체합니다.

이상적으로는 keywords의 MATCH AGAINST도 사용하고 싶습니다. 그래서, 내 선택권은 무엇입니까?

  • 가상 테이블의 일종입니까?
  • 하위 쿼리?
  • 다른 건 없나요?

이해하기 위해서는 예제 코드가 필요할 것입니다.

답변

1

이것은 당신이 묻는 질문에 대답하지 않습니다,하지만 난 쿼리의 WHERE 절에이 조건을 추가 생각 : 경우, GROUP_CONCAT의 반환을 스캔 할 필요가 없습니다 것 GROUP BY 전에

OR EXISTS (SELECT 1 
        FROM categories k 
       WHERE k.id = pc.category_id 
        AND k.title IN ('Test1','Test2') 
      )  

명세는 카테고리 제목이 지정된 검색 단어 중 하나와 일치하는 행을 반환하는 것입니다. 실제로 결과 집합에서 파생 된 keywords 열을 반환하는 요구 사항이 아닌 경우


, 나는 GROUP BY를 피할 것.

SELECT p.id AS id 
    , p.title AS title 
    , p.title AS company 
    FROM products p 
    JOIN companies co 
    ON co.id = p.company_id 
WHERE MATCH (p.title) AGAINST ('Test') 
    OR MATCH (co.title) AGAINST ('Test') 
    OR EXISTS (SELECT 1 
        FROM categories k 
        JOIN product_categories pc 
        ON pc.category_id = k.id 
       WHERE pc.product_id = p.id 
        AND k.title IN ('Test1','Test2') 
      ) 
ORDER BY p.id 
+0

예, 지금까지는 빠른 제품이었습니다 (4000 제품). 어떤 이유로 GROUP_CONCAT은 검색된 단어 만 반환하지만 코드에는 아무 것도 없다고 생각됩니다. 출력에 범주를 포함시키는 것도 좋을 것입니다. 그러나 그것은 이상합니다. –

+1

"k.title IN"은 MATCH 조건 자'MATCH (k.title) AGAINST 'Test'로 대체해야합니다. 하지만 원래 쿼리 (질문에 표시된)에'OR EXISTS'를 추가하는 것이'GROUP_CONCAT'에서'cat.title'에 대해 반환되는 행에 영향을 미칠 것이라고 생각하지 않습니다. (답변의 두 번째 쿼리는 'cat.title'을 반환하지는 않습니다. 왜냐하면 거기에 조인'categories' 테이블이 없으므로 사용할 수 없습니다.이 답변은 묻는 질문에 응답하지 않으며 다른 질문에 답합니다.) – spencer7593