2017-10-26 11 views
0

MySQL 쿼리를 사용하여 2 개의 테이블에서 데이터를 가져옵니다. 여기에 의 상태가 2 표 2입니다. 상태가 Transfer Out 인 모든 세부 정보를 가져오고 동시에 상태 인 세부 정보가 없어야하며 Transfer Out 뒤에 추가해야합니다. Transfer Out 뒤에 Transfer back In 인 세부 정보를 얻지 않아야합니다.하위 쿼리없이 MySQL 테이블에서 세부 정보 가져 오기

지금은 subquery을 사용하고 있습니다. 그러나 데이터 수가 증가하면 시간 초과 문제가 발생합니다. 쿼리를 다시 작성하고 동일한 결과를 얻는 더 좋은 방법이 있습니까?

내 쿼리 샘플

SELECT sq.etid 
    FROM (
     SELECT og.etid, pt.timestamp 
      FROM og_membership og 
      INNER JOIN table1 n ON(n.nid=og.etid) 
      INNER JOIN table2 pt ON(og.etid=pt.animal_nid) 
      WHERE og.entity_type='node' 
       AND pt.partner_gid = :gid 
       AND pt.shelter_gid = :our_gid 
       AND pt.type = 'Transfer Out' 
       AND (
       SELECT count(id) 
        FROM table2 
        WHERE timestamp > pt.timestamp 
         AND type = 'Transfer In' 
         AND partner_gid = :gid 
         AND shelter_gid = :our_gid 
        ) = 0 
     ) AS sq 
+0

마지막 거래가 '송금'되는 곳과 동일하지 않거나 송금 후 송금 이외의 거래가있을 수 있습니까? –

+0

"2 개의 테이블에서"- 3 개의 테이블처럼 보입니다! –

답변

0

당신은 아마도

DROP TABLE IF EXISTS LOANS; 

CREATE TABLE LOANS (ID INT AUTO_INCREMENT PRIMARY KEY, ISBN INT,DIRECTION VARCHAR(3), DT DATETIME); 

INSERT INTO LOANS(ISBN,DIRECTION,DT) VALUES 
(1,'OUT','2017-10-01 09:00:00'), 
(2,'OUT','2017-10-02 10:00:00'), 
(2,'IN', '2017-10-02 10:10:00'), 
(3,'REC','2017-10-02 10:00:00'), 
(4,'REC','2017-10-02 10:00:00'), 
(4,'OUT','2017-10-03 10:00:00'), 
(4,'IN', '2017-10-04 10:00:00'), 
(4,'OUT','2017-10-05 10:00:00') 
; 

SELECT ISBN 
FROM LOANS 
WHERE DIRECTION IN('OUT','IN') 
GROUP BY ISBN HAVING   
     MAX(CASE WHEN DIRECTION = 'OUT' THEN DT ELSE 0 END) > 
     MAX(CASE WHEN DIRECTION = 'IN' THEN DT ELSE 0 END) ; 

결과를 예를 들어 예를

select something 
from somehwere 
group by something having isnull(max(out_date),0) > isnull(max(indate) ,0) 

을위한하여 그룹과

을이 작업을 수행 할 수있다
+------+ 
| ISBN | 
+------+ 
| 1 | 
| 4 | 
+------+ 
2 rows in set (0.00 sec) 

DT가있는 경우 id 대신 사용할 수 있습니다.

+0

노력해 주셔서 감사합니다. 하지만, out_date 및 indate와 같은 필드는 없습니다. 둘 다 단일 타임 스탬프 컬럼을 가지고 있으며, 흡기/결과가 만들어지면 새로운 행이 추가됩니다. – Arun

+0

원칙은 변경되지 않습니다. 응답에 추가 된 예제를 참조하십시오. –

0

변경

(SELECT COUNT(id) FROM ...) = 0 

EXISTS (SELECT 1 FROM ...) 

에 바깥 쪽 쿼리 및 제 pt.timestamp 제거하십시오. (또는 pt.timestamp에 대한 확실하지 않은 이유가 있습니까?)

table2 필요 INDEX(type, partner_gid, shelter_gid, timestamp)이 있습니까? timestamp은 마지막에 있어야하지만 다른 순서는 관계가 없습니다.

table2INDEX(type, partner_gid, shelter_gid, animal_nid)이 필요하고; 열은 임의의 순서가 될 수 있습니다. (이 색인 과 결합 할 수 없습니다.)

og_membershipINDEX(etid, entity_type) (어느 쪽이든 순서대로).

INNER JOIN table1 n ON(n.nid=og.etid)이 검색어에 포함되어 있습니까? table1은 전혀 사용하지 않는 것 같습니다. 행의 존재를 확인하는 경우는 제외됩니다. 가능한 경우 제거하십시오.

변경 후 2 (또는 3σ) 테이블에 EXPLAIN SELECT ...SHOW CREATE TABLE을 입력하십시오.