반응형
두 개의 다른 테이블에 두 개의 count (*) 결과를 함께 추가하려면 어떻게합니까?
장난감과 게임이라는 두 개의 테이블이 있습니다.
+--------------------+------------------+
| 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가 관련된 장난감 + 게임의 총 수를 제공하는 쿼리를 원합니다.
기본적으로 다음 두 쿼리의 합계를 원합니다.
장난감에서 COUNT (*)를 선택하십시오. little_kid_id = 900; 게임에서 COUNT (*)를 선택하십시오. 여기서 little_kid1 = 900 또는 little_kid2 = 900 또는 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
)
이 쿼리가 실행될 가능성과 데이터 변경 빈도에 따라 다음과 같이 집계 된 테이블에 주기적으로 데이터를 넣을 수 있습니다.
CREATE TABLE aggregated (
little_kid_id INT UNSIGNED,
games_count INT UNSIGNED,
toys_count INT UNSIGNED,
PRIMARY KEY (little_kid_id)
);
성능면에서 빠르며 불쾌한 하위 쿼리를 피할 수 있습니다.
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;
이걸로 해봐...
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
반응형
'programing' 카테고리의 다른 글
Android에서 문자열을 URI로 변환 (0) | 2022.07.10 |
---|---|
64 비트 Android 장치에서 32 비트 네이티브 라이브러리를 사용하는 방법 (0) | 2021.01.17 |
객체가 Core Data에 존재하는지 여부를 확인하는 가장 빠른 방법은 무엇입니까? (0) | 2021.01.17 |
Facebook에 아직 공개 검색 API가 있습니까? (0) | 2021.01.17 |
PetClinic보다 큰 오픈 소스 Spring 샘플 프로젝트가 있습니까? (0) | 2021.01.17 |