开发者

MySQL wrong query while combining tables

I'm querying two tables in separate queries. Doing it that way brings the right results in less than a sec, however, if I try to merge them, it takes really long that I even have to kill the query (lots of records). I'm wondering what I'm doing wrong.

Desired Output

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

Query 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

Table 1 - query 1

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

Query 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

Table 2 - query 2

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


Why not do a simple 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

Just a thought...


A full join would work nicely, but since MySQL doesn't support full join.. you can UNION ALL between the two and take the MAX from the corresponding columns.

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


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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜