2011-02-15 3 views
2

별도의 쿼리로 두 개의 테이블을 쿼리하고 있습니다. 그런 식으로하면 1 초 이내에 올바른 결과를 얻을 수 있지만, 병합을 시도하면 쿼리 (레코드가 많음)를 죽여야하기까지 정말 오래 걸립니다. 내가 뭘 잘못하고 있는지 궁금해.테이블을 결합하는 동안 MySQL 잘못된 쿼리

원하는 출력

+--------+-----------+-----------+-----------+  
| name | computers | printers | tvs  | 
+--------+-----------+-----------+-----------+ 
| Peter | 12  | 1  | 5  | 
| Josh | 20  | 4  |   | 
| Bob | 15  | 4  | 9  | 
+--------+-----------+-----------+-----------+ 

검색어 1

SELECT 
    names.name, 
    SUM(IF(pcs.electronic = 'computers', 1,0)) AS computers, 
    SUM(IF(pcs.electronic = 'printers', 1,0)) AS printers 
FROM 
    electronics.pcs LEFT JOIN electronics.orders 
    ON pcs.id = orders.id 
    LEFT JOIN electronics.buying 
    ON orders.id = buying.id 
    LEFT JOIN dbnames.names names 
    ON names.clientid = pcs.clientid 
WHERE 
    pcs.clientid IS NOT NULL AND 
    pcs.belongs IN (10) 
GROUP BY pcs.clientid 

표 1 - 질의 1

+--------+-----------+-----------+ 
| name | computers | printers | 
+--------+-----------+-----------+ 
| Peter | 12  | 1  | 
| Josh | 20  | 4  | 
| Bob | 15  | 4  | 
+--------+-----------+-----------+ 

쿼리 2

SELECT 
    names.name, 
    SUM(IF(tvs.electronic = 'tvs', 1,0)) AS tvs 
FROM 
    electronics.tvs LEFT JOIN dbnames.names names 
    ON names.clientid = tvs.clientid 
WHERE 
    tvs.belongs IN (10) 
GROUP BY tvs.clientid 

표 2 - 쿼리 2

+--------+-----------+ 
| name | tvs  | 
+--------+-----------+ 
| Peter | 5  | 
| Bob | 9  | 
+--------+-----------+ 
+0

좋아요, 감사합니다 여러분! – Mike79

답변

0

이유는 간단 UNION하지? 그냥 생각

SELECT 
    names.name, 
    SUM(IF(pcs.electronic = 'computers', 1,0)) AS computers, 
    SUM(IF(pcs.electronic = 'printers', 1,0)) AS printers 
FROM 
    electronics.pcs LEFT JOIN electronics.orders 
    ON pcs.id = orders.id 
    LEFT JOIN electronics.buying 
    ON orders.id = buying.id 
    LEFT JOIN dbnames.names names 
    ON names.clientid = pcs.clientid 
WHERE 
    pcs.clientid IS NOT NULL AND 
    pcs.belongs IN (10) 
GROUP BY pcs.clientid 

UNION ALL 

SELECT 
    names.name, 
    SUM(IF(tvs.electronic = 'tvs', 1,0)) AS tvs 
FROM 
    electronics.tvs LEFT JOIN dbnames.names names 
    ON names.clientid = tvs.clientid 
WHERE 
    tvs.belongs IN (10) 
GROUP BY tvs.clientid 

...

+0

궁금한데, 모두 합집합을 위해 같은 수의 열이 필요하지 않니? 또한 레코드의 측면에서 결과 집합을 결합 할 것이지만 필요한 것은 추가 열입니다. – Mike79

+0

당신은 올바른 사과, @cyberkiwi의 라인을 따라 생각하고 있었는데, 그냥 잘못 나온 :). 'UNION'이 아닌'FULL JOIN' 또는'FULL OUTER JOIN' 타입이 필요할 것입니다. 어쨌든 – Eli

+0

감사합니다. FULL JOINS가 MySQL에서 지원되는지 궁금합니다. – Mike79

0

멋지게 작동합니다 가입 가득하지만, MySQL은 지원하지 않기 때문에 전체 가입 .. 할 수 있습니다 UNION ALL 두와 해당 열에서 MAX을 사이 .

SELECT clientid, name, 
    MAX(computers) computers, 
    MAX(printers) printers, 
    MAX(tvs) tvs 
FROM 
(
    SELECT 
     pcs.clientid, 
     names.name, 
     SUM(IF(pcs.electronic = 'computers', 1,0)) AS computers, 
     SUM(IF(pcs.electronic = 'printers', 1,0)) AS printers, 
     NULL 
    FROM 
     electronics.pcs LEFT JOIN electronics.orders 
     ON pcs.id = orders.id 
     LEFT JOIN electronics.buying 
     ON orders.id = buying.id 
     LEFT JOIN dbnames.names names 
     ON names.clientid = pcs.clientid 
    WHERE 
     pcs.clientid IS NOT NULL AND 
     pcs.belongs IN (10) 
    GROUP BY pcs.clientid, names.name 
    UNION ALL 
    SELECT 
     tvs.clientid, 
     names.name, 
     NULL, NULL, 
     SUM(IF(tvs.electronic = 'tvs', 1,0)) AS tvs 
    FROM 
     electronics.tvs LEFT JOIN dbnames.names names 
     ON names.clientid = tvs.clientid 
    WHERE 
     tvs.belongs IN (10) 
    GROUP BY tvs.clientid, names.name 
) Q2 
GROUP BY clientid, name 
+0

MySQL 5에서 FULL JOINS가 지원됩니까? – Mike79

+0

@ Mike79 당신이 옳습니다. 죄송합니다. 대답은 – RichardTheKiwi

+0

입니다. 흥미 롭습니다. (OP에 뒤이어)'SUM (IF ({expr}, 1,0))'}을 사용했는데, 보통'COUNT (IF ({expr}, 1, NULL))를 사용합니다. '나는 어느 것이 더 좋을까? 'SUM ({expr}) '을 사용하여'IF'를 건너 뛸 수도 있습니다. –

0
select * 
from 
(
    ... first query 
) as query1 
left join 
(
    ... second query 
) as query2 
on query1.name=query2.name; 
관련 문제