두 개의 다른 테이블에 두 카운트 (*) 결과를 함께 추가합니까?

StackOverflow https://stackoverflow.com/questions/826365

  •  05-07-2019
  •  | 
  •  

문제

장난감과 게임의 두 테이블이 있습니다.

+--------------------+------------------+
| 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 쿼리로 가져올 수 있습니까? 분명히, 나는 그들을 프로그래밍 방식으로 요약 할 수 있지만, 그것은 덜 바람직합니다.

(고려 된 예제는 스키마가 비효율적으로 보이게한다는 것을 알고 있습니다. 스키마를 변경할 수 없다고 가정 해 봅시다.)

도움이 되었습니까?

해결책

마무리하고 하위 쿼리를 사용하십시오.

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

짜잔!

다른 팁

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
)
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;

듀얼 테이블에서 선택합니다

이 쿼리가 얼마나 많이 실행될 가능성과 데이터가 얼마나 자주 변경되는지에 따라 다음과 같은 집계 된 테이블에 데이터를 주기적으로 변경할 수 있습니다.

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

성능 현명한 현명한 속도가 빠르며 불쾌한 하위 쿼리를 피합니다.

이거 한번 해봐...

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
  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
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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top