Как мне добавить два результата count (*) в две разные таблицы? - PullRequest
51 голосов
/ 05 мая 2009

У меня есть два стола: игрушки и игры.

+--------------------+------------------+
| 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 |
+--------------------+------------------+

У маленького ребенка может быть несколько игрушек. Маленький ребенок может участвовать в нескольких играх одновременно.

Мне нужен запрос, который даст мне общее количество игрушек + игр, в которых участвует little_kid.

По сути, я хочу получить сумму этих двух запросов:

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;

Можно ли получить это в одном запросе SQL? Очевидно, что я могу суммировать их программно, но это менее желательно.

(Я понимаю, что надуманный пример делает схему неэффективной. Давайте предположим, что мы не можем изменить схему.)

Ответы [ 7 ]

111 голосов
/ 05 мая 2009

Заверните их и используйте подзапросы:

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!

5 голосов
/ 05 мая 2009
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 голосов
/ 08 ноября 2012

Попробуйте это ...

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
4 голосов
/ 06 мая 2009

В зависимости от того, насколько вероятно выполнение этого запроса и как часто данные меняются, вы можете периодически помещать данные в агрегированную таблицу, например:

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

Высокая производительность, которая будет очень горячей и позволит избежать любых неприятных подзапросов.

3 голосов
/ 16 февраля 2018
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 голосов
/ 12 апреля 2019
select t1.tx,t2.px,t3.mx,t2.px + t3.mx  
        as total from(
SELECT COUNT (DISTINCT id) as tx
FROM Customer) as t1
cross join(
select COUNT (DISTINCT name) as px
FROM details 
) as t2
cross join(
select count (distinct device_id) as mx
from detailconfig 
) as t3
0 голосов
/ 30 декабря 2016
  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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...