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;
精彩评论