2013-06-20 67 views
4

我在MySQL數據庫中有兩個表。第一個有一個部門名稱列表。如何基於mysql中的另一個表來統計一個表中的行

departments 
    abbreviation | name 
    -------------|------------- 
    ACC   | accounting 
    BUS   | business 
    ... 

第二個表格包含一個名稱包含部門縮寫的課程列表。

courses 
    section  | name 
    -------------|------------- 
    ACC-101-01 | Intro to Accounting 
    ACC-110-01 | More accounting 
    BUS-200-02 | Business etc. 
    ... 

我想編寫一個查詢,將,在departments表的每一行,給我在courses表中有多少行一樣的縮寫我有一個計數。下面這樣的:

我可以爲一個單獨的部門與查詢

SELECT COUNT(*) FROM courses WHERE section LIKE '%ACC%' 
    (gives me 2) 

雖然我可以循環在PHP中做到這一點通過並執行上面的查詢多次,我寧願做它在一個單一的查詢。這是我正在考慮的僞代碼...

SELECT department.abbreviation, num FROM 
    for each row in departments 
     SELECT COUNT(*) AS num FROM classes WHERE section LIKE CONCAT('%',departments.abbreviation,'%) 

任何想法?

回答

6
SELECT d.abbreviation, COUNT(*) num 
FROM departments d 
INNER JOIN courses c ON c.section LIKE CONCAT(d.abbreviation, "%") 
GROUP BY d.abbreviation 

Sql Fiddle

+0

+1 - 通過打敗我12秒:) –

+0

它的工作原理!代碼量比我預期的要少很多。而且比我預期的時間要少很多。謝謝!! –

0

我快速的解決方案,但不是最好的,可能是:

SELECT abbreviation, 
(SELECT COUNT(*) FROM courses C WHERE D.abbreviation = SUBSTRING(C.abbreviation, 0, 3)) AS c 
FROM departments D; 
0

這給一個鏡頭:

select 
    d.abbreviation, 
    count(d.abbreviation) count 
from 
    departments d 
inner join 
    courses c 
on (LOCATE(d.abbreviation,c.section) <> 0) 
group by d.abbreviation; 
+0

其實我更喜歡Steve的回答 – Edd

相關問題