2008-11-06 69 views
2
 
SELECT `name` , COUNT(*) AS `count` 
FROM `t1`, `t2` 
WHERE `t2`.`id` = `t1`.`id` 
GROUP BY `t2`.`id` 

我想從t1中獲取名稱,並在t2中獲得與t1上相同的行數。MySQL Cross-Table Count(*)查詢幫助

我已經得到了上述,但是如果t2中沒有匹配的行,它將不會返回任何數據。如果沒有行,我寧願count爲0(或NULL),並且名稱仍然返回。

編輯:我希望能根據count降序排列。 (或name ASC)是可能的嗎?

回答

3

這應該爲你工作:

SELECT `t1`.`id` , COUNT(`t2`.`id`) AS `count` 
FROM `t1` LEFT JOIN `t2` ON `t1`.`id` = `t2`.`id` 
GROUP BY `t1`.`id` 

LEFT JOIN確保你有一個從T1的所有行,和COUNT(t2id。)使它只計算t2.id不爲空的記錄(即 - 那些確實存在於t2中的記錄)

+0

感謝您的幫助。我希望能夠通過`count`降序進行排序。 (或`name` ASC)可能嗎? – Steve 2008-11-06 10:09:22

+0

嗯......你的解決方案爲'count'顯示'1',如果現在有t2行 – Steve 2008-11-06 10:19:18

0

做一個聯盟來獲得另一組

SELECT `name` , COUNT(*) AS `count` 
FROM `t1`, `t2` 
WHERE `t2`.`id` = `t1`.`id` 
GROUP BY `t2`.`id` 
UNION 
Select name, 0 as count 
from t1 
where NOT EXISTS (select 1 from t2 where `t2`.`id` = `t1`.`id`) 
+0

感謝您的幫助。這是最有效率/優雅的方式嗎?有沒有辦法使用JOIN做到這一點? – Steve 2008-11-06 09:58:51

1

按COUNT遞減這種排序,並且在同一計數內上升通過name。在t2沒有行名稱將與0

SELECT 
    `t1`.`name`, 
    COUNT(`t2`.`id`) AS `count` 
FROM 
    `t1` 
    LEFT JOIN `t2` ON`t2`.`id` = `t1`.`id` 
GROUP BY 
    `t1`.`name` 
ORDER BY 
    COUNT(`t2`.`id`) DESC, 
    `t1`.`name` 

計數返回修改ORDER BY您的需求。