所有表列,顯示計數我有兩個表:表1是這樣的:集團通過在MySQL
id type
1 bike
2 car
3 cycle
4 bike
而表2是這樣的:
id type
1 bike
2 car
我希望我的最後輸出到看起來像下面這樣:
type count_table1 count_table2
bike 2 1
car 1 1
cycle 1 0
什麼是在SQL中執行此操作的最有效方法?
所有表列,顯示計數我有兩個表:表1是這樣的:集團通過在MySQL
id type
1 bike
2 car
3 cycle
4 bike
而表2是這樣的:
id type
1 bike
2 car
我希望我的最後輸出到看起來像下面這樣:
type count_table1 count_table2
bike 2 1
car 1 1
cycle 1 0
什麼是在SQL中執行此操作的最有效方法?
簡單的解決方案,無需複雜的表連接&功能:
SELECT type, MAX(count_table1) as count_table1, MAX(count_table2) as count_table2 FROM (
(
SELECT type, COUNT(*) AS count_table1, 0 AS count_table2
FROM Table1
GROUP BY type
) UNION (
SELECT type, 0 AS count_table1, COUNT(*) AS count_table2
FROM Table2
GROUP BY type)
) AS tmp
GROUP BY type
select type, count(*) from table1 group by type
select type, count(*) from table2 group by type
你可以試試這個:
SELECT t1.TYPE,
ifnull(t1.COUNT1,0) CountTable1,
ifnull(t2.COUNT2,0) CountTable2
FROM (SELECT TYPE,
COUNT(*) count1
FROM TABLE1
GROUP BY TYPE)T1
LEFT JOIN (SELECT TYPE,
COUNT(*) count2
FROM TABLE2
GROUP BY TYPE)T2
ON t1.TYPE = t2.TYPE
UNION
SELECT t1.TYPE,
t1.COUNT1,
t2.COUNT2
FROM (SELECT TYPE,
COUNT(*) count1
FROM TABLE1
GROUP BY TYPE)T1
RIGHT JOIN (SELECT TYPE,
COUNT(*) count2
FROM TABLE2
GROUP BY TYPE)T2
ON t1.TYPE = t2.TYPE
查看SQL Fiddle我的工作示例。
select
T.type
,IFNULL(COUNT(T1.type),0) as 'count_table1'
,IFNULL(COUNT(T2.type),0) as 'count_table2'
from
Table1 as T1
left join Table2 as T2 on T2.id = T1.id
group by
T.type
union
select
T.type
,IFNULL(COUNT(T1.type),0) as 'count_table1'
,IFNULL(COUNT(T2.type),0) as 'count_table2'
from
Table2 as T
left join Table1 as T1 on T1.id = T2.id
group by
T.type
請注意,這個問題在MYSQL中,所以ISNULL不起作用。 – Gidil
SELECT a.TYPE,
COUNT(a.ID),
COUNT(b.ID)
FROM TABLE1 AS a
LEFT OUTER JOIN TABLE2 AS b
ON a.TYPE = b.TYPE
GROUP BY a.TYPE
UNION
SELECT b.TYPE,
COUNT(a.ID),
COUNT(b.ID)
FROM TABLE1 AS a
RIGHT OUTER JOIN TABLE2 AS b
ON a.TYPE = b.TYPE
GROUP BY b.TYPE
@Gidil。謝謝 –
當我運行你的查詢時,我得到了不同的結果。你能檢查爲什麼會發生這種情況嗎?我使用SQL小提琴中的數據集進行查詢:http://sqlfiddle.com/#!2/fc9ea/23 – Gidil
@Gidil。我應該使用count(獨特的id),謝謝指出它。 http://sqlfiddle.com/#!2/fc9ea/36 –
另一種方式來做到這一點
SELECT a.type,
COALESCE(b.type_count, 0) count_table1,
COALESCE(c.type_count, 0) count_table2
FROM
(
SELECT type FROM Table1
UNION
SELECT type FROM Table2
) a LEFT JOIN
(
SELECT type, COUNT(*) type_count
FROM Table1
GROUP BY type
) b ON a.type = b.type LEFT JOIN
(
SELECT type, COUNT(*) type_count
FROM Table2
GROUP BY type
) c ON a.type = c.type
一些explan ation:
a
得到一個明確的類型列表(UNION
負責)。b
和c
分別計算table1
和table2
中的類型出現次數。SELECT
使用LEFT JOIN
和COALESCE
將它們全部結合在一起,用0
替代不存在的值。輸出:
| TYPE | COUNT_TABLE1 | COUNT_TABLE2 | |-------|--------------|--------------| | bike | 2 | 1 | | car | 1 | 1 | | cycle | 1 | 0 |
這裏是SQLFiddle演示
感謝您的回答。 – Seetha
SELECT a.`TYPE`,
COALESCE(tbl1CNT,0) as tbl1CNT,
COALESCE(tbl2CNT,0) as tbl2CNT
FROM (SELECT `TYPE`
FROM TABLE1
UNION
SELECT `TYPE`
FROM TABLE2) a
LEFT JOIN (SELECT `TYPE`,
COUNT(*) AS tbl1CNT
FROM TABLE1
GROUP BY `TYPE`) b
ON a.`TYPE` = b. `TYPE`
LEFT JOIN (SELECT `TYPE`,
COUNT(*) AS tbl2CNT
FROM TABLE2
GROUP BY `TYPE`) c
ON a.`TYPE` = c. `TYPE`
請注意,此查詢在預期爲0的位置返回NULL。 – Gidil
更新..立即檢查 –
其實這樣做在MySQL則是另一種模式設計最有效的方式,我想。 –