2012-09-10 4 views
0

EDIT FINAL : 수정 된 코드는 5.5에서 작동하지만 5.0에서는 약간 다른 행 집합을 얻습니다. ..5.5가 두 가지 쿼리를 사용하여 다른 결과를 반환하는 이유는 무엇입니까?

테이블 이름의 일부를 제거하는 나는 위의 쿼리를 수정 한

SELECT DISTINCT 
    sql_no_cache as job.id, 
    job.id as job_id, 
    job.job_status, 
    job.servee_name, 
    kase.plaintiff, 
    index_number, 
    lawfirm_filenumber, 
    DATE_FORMAT(job.datetime_received, '%m/%d/%Y') as date_received, 
    DATE_FORMAT(job.date_sent_to_court, '%m/%d/%Y') as date_sent_to_court, 
    DATE_FORMAT(kase.date_kase_filed, '%m/%d/%Y') as date_kase_filed, 
    TO_DAYS(NOW())-TO_DAYS(kase.date_kase_filed) as thedays, 
    DATE_FORMAT(kase.court_datetime, '%m/%d/%Y %h:%i %p') as court_date, 
    kase.court_room, 
    CONCAT(LUcourt.court_county," - ",LUcourt.court_type) as court_name, 
    DATE_FORMAT(job.datetime_served, '%m/%d/%Y') as datetime_served, 
    CONCAT(server.namefirst,' ', server.namelast) as server_name 

FROM  job 
LEFT JOIN kase  ON job.kase_id = kase.id 
LEFT JOIN kasebilling ON kasebilling.kase_id = kase.id 
LEFT JOIN server  ON job.server_id = server.id 
LEFT JOIN client  ON client.id  = kase.client_id 
LEFT JOIN LUcourt  ON LUcourt.id = kase.court_id 

    WHERE job.subscriber_id = 1 
ORDER BY job_id + 0 
    LIMIT 0,500; 

</pre> 
i modified the query but it wont run ... 

    SELECT DISTINCT sql_no_cache job.id, job.id as job_id, job.job_status, job.servee_name, kase.plaintiff, index_number, lawfirm_filenumber, DATE_FORMAT(job.datetime_received, '%m/%d/%Y') as date_received, DATE_FORMAT(job.date_sent_to_court, '%m/%d/%Y') as date_sent_to_court, DATE_FORMAT(kase.date_kase_filed, '%m/%d/%Y') as date_kase_filed, TO_DAYS(NOW())-TO_DAYS(kase.date_kase_filed) as thedays, DATE_FORMAT(kase.court_datetime, '%m/%d/%Y %h:%i %p') as court_date, kase.court_room, CONCAT(LUcourt.court_county," - ",LUcourt.court_type) as court_name, DATE_FORMAT(job.datetime_served, '%m/%d/%Y') as datetime_served, concat(server.namefirst,' ', server.namelast) as server_name FROM job 
    LEFT JOIN kase ON job.kase_id = kase.id 
    LEFT JOIN kasebilling ON kasebilling.kase_id = kase.id 
    LEFT JOIN server ON job.server_id = server.id 
    left join client on client.id=kase.client_id 
    left join LUcourt on LUcourt.id=kase.court_id WHERE job.subscriber_id = 1 and job_id in (select distinct job.id from job where job.subscriber_id = '1' order by id+0) LIMIT 0,500 
</pre> 

다음 쿼리 ... 내가 요청에 의한 순서가 매우 빠르게 진행 제거하는 경우에는 무슨 일이되는 것은. .. 나는 그것의 순서가 한계 500뿐만 아니라 모든 행에 의해서라고 생각합니다 ... 어떻게하면이 명령을 더 빨리 할 수 ​​있습니까? 어떤 도움을

PS .... 감사 감사하겠습니다 : 자사는

설명 ... order_by에 filesort를 사용하여 : 내가 쿼리를 수정하지만 늘 실행

 
+----+-------------+-------------+--------+--------------------------------------------------------------------------------------+---------------------------------------------+---------+-----------------------+--------+----------------------------------------------+ 
| id | select_type | table  | type | possible_keys                  | key           | key_len | ref     | rows | Extra          | 
+----+-------------+-------------+--------+--------------------------------------------------------------------------------------+---------------------------------------------+---------+-----------------------+--------+----------------------------------------------+ 
| 1 | SIMPLE  | job   | ref | subscriber_id,subscriber_id-job_loc-client_loc-server_loc,sub_id_idx_servee_name_idx | subscriber_id-job_loc-client_loc-server_loc | 4  | const     | 362381 | Using where; Using temporary; Using filesort | 
| 1 | SIMPLE  | kase  | eq_ref | PRIMARY                    | PRIMARY          | 4  | pserve.job.kase_id |  1 |            | 
| 1 | SIMPLE  | kasebilling | ref | kase_id                    | kase_id          | 4  | pserve.kase.id  |  2 | Using index         | 
| 1 | SIMPLE  | server  | eq_ref | PRIMARY                    | PRIMARY          | 4  | pserve.job.server_id |  1 |            | 
| 1 | SIMPLE  | client  | eq_ref | PRIMARY                    | PRIMARY          | 4  | pserve.kase.client_id |  1 | Using index         | 
| 1 | SIMPLE  | LUcourt  | eq_ref | PRIMARY                    | PRIMARY          | 4  | pserve.kase.court_id |  1 |            | 
+----+-------------+-------------+--------+--------------------------------------------------------------------------------------+---------------------------------------------+---------+-----------------------+--------+----------------------------------------------+ 

...

SELECT DISTINCT sql_no_cache job.id, job.id as job_id, job.job_status, job.servee_name, kase.plaintiff, index_number, lawfirm_filenumber, DATE_FORMAT(job.datetime_received, '%m/%d/%Y') as date_received, DATE_FORMAT(job.date_sent_to_court, '%m/%d/%Y') as date_sent_to_court, DATE_FORMAT(kase.date_kase_filed, '%m/%d/%Y') as date_kase_filed, TO_DAYS(NOW())-TO_DAYS(kase.date_kase_filed) as thedays, DATE_FORMAT(kase.court_datetime, '%m/%d/%Y %h:%i %p') as court_date, kase.court_room, CONCAT(LUcourt.court_county," - ",LUcourt.court_type) as court_name, DATE_FORMAT(job.datetime_served, '%m/%d/%Y') as datetime_served, concat(server.namefirst,' ', server.namelast) as server_name FROM job 
LEFT JOIN kase ON job.kase_id = kase.id 
LEFT JOIN kasebilling ON kasebilling.kase_id = kase.id 
LEFT JOIN server ON job.server_id = server.id 
left join client on client.id=kase.client_id 
left join LUcourt on LUcourt.id=kase.court_id WHERE job.subscriber_id = 1 and job_id in (select distinct job.id from job where job.subscriber_id = '1' order by id+0) LIMIT 0,500 
+2

가 * 나는 다만하여 순서를 생각을 500을 제한하지만 모든 행을 * - 어떻게 주문 하시겠습니까? – RedFilter

+1

RedFilter가 말한 것에 덧붙여, 모든 행을 주문하지 않으면 어떤 행이 처음 500인지 알 수 없습니다. 쿼리 속도를 높이려면'job_id'를 인덱싱 했습니까? – Palladium

+2

한계가 작동하려면 mysql이 쿼리가 반환 할 모든 행을 가져와야하며, ** THEN ** 지정된 처음 500 행을 가져야합니다. –

답변

0

먼저 추악한 시도 : 총 행의 수를 주문하고 제한 할 수 감소뿐만 아니라 WHERE 부분에 그것을 유지하기 위해 job.subscriber_id = '1'LEFT JOIN job에 조건을 추가 :

FROM  kase 
LEFT JOIN job  ON k.kase_id = kase.id 
       AND job.subscriber_id = '1' /* condition copied here ... */ 
LEFT JOIN kb  ON kb.kase_id = kase.id 
LEFT JOIN server ON job.server_id = server.id 
LEFT JOIN client ON client.id = kase.client_id 
LEFT JOIN LUcourt ON LUcourt.id = kase.court_id 
    WHERE job.subscriber_id = '1'   /* ... but also kept here */ 
ORDER BY job.id 
    LIMIT 0,500; 

두 번째 시도, 훨씬 더 추한 : 첫 번째 500 kase * job 조합을 서브-선택하고 왼쪽은 subselected 행에 대해 다른 테이블 가입 :

FROM 
(SELECT * /* you probably have to list & alias column names if necessary */ 
    FROM  kase 
    LEFT JOIN job ON k.kase_id = kase.id 
     WHERE job.subscriber_id = '1' 
    ORDER BY job.id 
     LIMIT 0,500 
) AS kase_job 
/* Now we have 500 rows*/ 

LEFT JOIN kb  ON kb.kase_id = kase_job.id 
LEFT JOIN server ON kase_job.server_id = server.id 
LEFT JOIN client ON client.id = kase_job.client_id 
LEFT JOIN LUcourt ON LUcourt.id = kase_job.court_id 

/* If you do `(500 rows) LEFT JOIN whatever` you can be sure you have 
    at least 500 rows (never less) here, so you have to ORDER/LIMIT then again 
*/ 

ORDER BY kase_job.id 
    LIMIT 0,500; 
+0

시도했습니다. 내가 편집하고 아무 일도하지 않았다는 적응을 고안해 .. 나는 내가 dqn을 풀다가 2 초안에 필요하다고 생각했다. 그때 나머지는 그것을 빼앗아 야한다. – phper86

+0

내 코드 almos twork에 신경 쓰지는 마라. 데이터 – phper86

관련 문제