2011-01-02 2 views
0

검색하는 데 문제가 있습니다. 현재이 작업은 maintenance_parts 테이블에 최소 1 행 이상의 결과 만 반환합니다. 0 부분 행이 있더라도 결과를 반환하고 싶습니다.결과에 여러 가지 문제가 발생하지 않도록이 SQL을 향상시킬 수 있습니까?

두 번째 문제점은 차량을 검색 할 때 여러 개의 결과 (여러 유지 관리 행)가 반환되어야하는 경우에만 해당 차량에 대해 1 개의 결과 만 반환한다는 것입니다.

일부 배경 정보 : 사용자는 2 개의 입력란을 채 웁니다. 필드는 차량 및 키워드입니다. 차량 필드는 제조사, 모델, VIN, 트럭 번호 (종종 2 ~ 3 자리 또는 2 자리 숫자 뒤에 오는 접두어) 및 트럭 테이블에 속하는 다른 몇 가지 필드를 기반으로 검색 할 수 있도록합니다. 키워드는 maintenance 및 maintenance_parts 테이블 (작업 설명, 부품 이름, 부품 번호 등)의 대부분의 필드를 검색합니다.

maintenance_parts 테이블은 각 유지 관리 행에 대해 0, 1 또는 그 이상의 행을 포함 할 수 있습니다. 트럭 테이블에는 모든 유지 보수 행마다 정확하게 1 개의 행이 있습니다. 트럭에는 여러 유지 관리 기록이있을 수 있습니다.

"SELECT M.maintenance_id, M.some_id, M.type_code, M.service_date, M.mileage, M.mg_id, M.mg_type, M.comments, M.work_done, 
        MATCH(M.comments, M.work_done) AGAINST('$keywords') + 
        MATCH(P.part_num, P.part_desc, P.part_ref) AGAINST('$keywords') + 
        MATCH(T.truck_number, T.make, T.model, T.engine, T.vin_number, T.transmission_number, T.comments) AGAINST('$vehicle') 
        AS score 
       FROM maintenance M, maintenance_parts P, truck T 
       WHERE M.maintenance_id = P.maintenance_id 
       AND M.some_id = T.truck_id 
       AND M.type_code = 'truck' 
       AND (
        (MATCH(T.truck_number, T.make, T.model, T.engine, T.vin_number, T.transmission_number, T.comments) AGAINST('$vehicle') 
        OR T.truck_number LIKE '%$vehicle%') 
        OR MATCH(P.part_num, P.part_desc, P.part_ref) AGAINST('$keywords') 
        OR MATCH(M.comments, M.work_done) AGAINST('$keywords') 
       ) 
       AND M.status = 'A' GROUP BY maintenance_id ORDER BY score DESC, maintenance_id DESC LIMIT 0, $limit" 
+0

가능한 중복 아래 해결해야한다 : //stackoverflow.com/questions/4576473/what-can-i-do-to-make-this-sql-return-results-in-certain-situations) –

답변

1

귀하의 코드는 당신이해야 할 첫 번째 일은 당신이이 작업을 수행 한 후에는 모든에 대한 null 값을 얻을 것이다

FROM maintenance M 
    JOIN truck T ON t.truck_id=M.some_id 
    LEFT JOIN maintenance_parts P ON M.maintenance_id = P.maintenance_id 
    WHERE... 

가입 왼쪽이 변환입니다 유지 관리 및 Maintenace_parts 사이에 가입 않습니다 일치하는 행을 찾을 수없는 경우 maintenance_parts의 열. 당신의 코드가 선택과 절 MATCH 기능이 제대로 NULLS 제대로 작동합니다/리뷰를 확인하는 null로

코드를 작동 어디

OR MATCH(P.part_num, P.part_desc, P.part_ref) AGAINST('$keywords') 

을 다음되는이와 OK, 그러나 확인합니다 나타납니다 두 번째 문제는 유지 관리 ID 대신 truck_id 대신 그룹화하는 것입니다. 필드에 의해 그룹을 변경해보십시오, 당신의 두 번째 문제

개정 쿼리 ​​(HTTP [? 내가 특정 상황에서이 SQL 리턴 결과를 만들기 위해 할 수있는 일]의

SELECT T.TRUCK_ID,M.maintenance_id, M.some_id, M.type_code, M.service_date, 
      M.mileage, M.mg_id, M.mg_type, M.comments, M.work_done, 
      MATCH(M.comments, M.work_done) AGAINST('$keywords') + 
      IfNull(P.PartScore,0) + 
      MATCH(T.truck_number, T.make, T.model, T.engine, T.vin_number, T.transmission_number, T.comments) AGAINST('$vehicle') 
      AS score 
        FROM maintenance M, 
        JOIN 

        (SELECT Truck_id,truck_number, make, model, engine, vin_number,   transmission_number,comments FROM Truck 
UNION 
SELECT Truck_id,truck_number, make, model, engine, vin_number,   transmission_number,comments FROM Trailer 
) 

T 
        ON M.some_id=T.Truck_id 
        LEFT JOIN 
        (SELECT maintenance_id,SUM(MATCH(P.part_num, P.part_desc, P.part_ref)    AGAINST('$keywords')) AS PartScore 
        FROM maintenance_parts 
        GROUP BY maintenance_id) P 
        P ON M.maintenance_id = P.maintenance_id 
        WHERE M.type_code = 'truck' 
        AND (
         (MATCH(T.truck_number, T.make, T.model, T.engine, T.vin_number, T.transmission_number, T.comments) AGAINST('$vehicle') 
         OR T.truck_number LIKE '%$vehicle%') 
         OR MATCH(P.part_num, P.part_desc, P.part_ref) AGAINST('$keywords') 
         OR MATCH(M.comments, M.work_done) AGAINST('$keywords') 
        ) 
        AND M.status = 'A' 
    ORDER BY score DESC, maintenance_id DESC 
    LIMIT 0, $limit" 
+0

다음과 같이 표시됩니다. # 1054 - 알 수없는 열 'M.maintenance_id' 'on clause' –

+1

놀랍지 만, 원래 코드가 그것을 발견했기 때문에. 모든 테이블에 대해 JOIN 메소드를 사용하여 변환 할 수있는 대답을 편집했습니다. MYSQL에는 메소드를 혼합 할 수없는 항목이있을 수 있습니다. 시도해보십시오 ... – Sparky

+0

또한 그룹을 바꿀 때 select 절의 필드 maintenance_id를 TRUCK_ID로 바꿔야합니다. 어쨌든 GROUP BY를 사용하는 이유는 무엇이든 필요하지 않다는 것입니다. – Sparky

관련 문제