2009-05-05 6 views
37

Tengo dos mesas: Juguetes y juegos.¿Cómo agrego dos resultados de conteo (*) juntos en dos tablas diferentes?

+--------------------+------------------+ 
| Field    | Type    | 
+--------------------+------------------+ 
| toy_id    | int(10) unsigned | 
| little_kid_id  | int(10) unsigned | 
+--------------------+------------------+ 

+--------------------+------------------+ 
| Field    | Type    | 
+--------------------+------------------+ 
| game_id   | int(10) unsigned | 
| little_kid1  | int(10) unsigned | 
| little_kid2  | int(10) unsigned | 
| little_kid3  | int(10) unsigned | 
+--------------------+------------------+ 

Un niño pequeño puede tener varios juguetes. Un niño pequeño puede participar en múltiples juegos a la vez.

Quiero una consulta que me dará la cantidad total de juguetes + juegos con los que está involucrado un little_kid.

Básicamente, quiero que la suma de estas dos consultas:

 
SELECT COUNT(*) FROM Toys WHERE little_kid_id = 900; 
SELECT COUNT(*) from Games WHERE little_kid1 = 900 
           OR little_kid2 = 900 
           OR little_kid3 = 900; 

¿Es posible conseguir esto en una sola consulta SQL? Obviamente, puedo sumarlos programáticamente, pero eso es menos deseable.

(me di cuenta que el ejemplo artificial hace que la mirada ineficiente esquema Vamos a suponer que no podemos cambiar el esquema..)

Respuesta

86

envolverlos y utilizar subconsultas:

SELECT 
(SELECT COUNT(*) FROM Toys WHERE little_kid_id = 900)+ 
(SELECT COUNT(*) from Games WHERE little_kid1 = 900 
           OR little_kid2 = 900 
           OR little_kid3 = 900) 
AS SumCount 

Voila!

+0

Saludos! Sabía que tenía que ser algo simple como eso. – Runcible

+0

cómo podemos obtenerlo sin la subconsulta –

+0

Usted me salvó el día. Gracias. –

5
SELECT COUNT(1) FROM 
(
    SELECT 1 FROM Toys WHERE little_kid_id = 900 
    UNION 
    SELECT 1 FROM Games WHERE little_kid1 = 900 
         OR little_kid2 = 900 
         OR little_kid3 = 900 
) 
4

Dependiendo de cuánto es probable que se ejecute esta consulta y con qué frecuencia los cambios de datos se puede poner periódicamente datos en una tabla agregada como esto:

CREATE TABLE aggregated (
    little_kid_id INT UNSIGNED, 
    games_count INT UNSIGNED, 
    toys_count INT UNSIGNED, 
    PRIMARY KEY (little_kid_id) 
); 

En cuanto al rendimiento que sería s * * t caliente rápido y evita cualquier sub-consulta desagradable.

3

Prueba con esto ...

db: mysql 

SELECT SUM(dum.tab) AS total FROM (
SELECT COUNT(b.category_id) AS tab FROM tblcategory AS b WHERE b.category_id=1 
UNION ALL 
SELECT COUNT(a.category_id) AS tab FROM tblcategory AS a WHERE a.category_id=2 
) AS dum 
0
SELECT M.*,M.TOYSCOUNT+M.GAMECOUNT 
FROM (
    (SELECT COUNT(*) FROM Toys WHERE little_kid_id) AS TOYSCOUNT, 
    (SELECT COUNT(*) from Games WHERE little_kid1 = 900 OR little_kid2 = 900 OR little_kid3 = 900) AS GAMECOUNT 
    ) M 
0
SELECT 
((SELECT COUNT(*) FROM Toys WHERE little_kid_id = 900)+ 
(SELECT COUNT(*) from Games WHERE little_kid1 = 900 
           OR little_kid2 = 900 
           OR little_kid3 = 900)) 
AS Sum FROM DUAL; 
+0

Proporcione la descripción a su respuesta por favor. – MKR

Cuestiones relacionadas