2013-07-23 67 views
0

我有列的用戶表:user_id, mechanic_id組mysql的計數值分開場

id

機械錶,我想看看有多少用戶具有相同的機械師。

用戶表

+-------------------------+ 
| user_Id mechanic_id | 
+-------------------------+ 
| 1   1,2   | 
| 2   2,1   | 
| 3   2,1,8,16 | 
| 4   1,16,3  | 
+-------------------------+ 

力學表

+------+ 
| id | 
+------+ 
| 1 | 
| 2 | 
| 3 | 
    ... 

計數爲$ ID1爲:4

計數爲$ ID2爲:3

計數爲$ ID3是: 1

計數$ ID8是:1個

計數$ ID16是:2

+1

你爲什麼存儲數據的逗號分隔的列表?你應該認真考慮正常化你的表格。 – Taryn

+0

非常相似http://stackoverflow.com/questions/4155873/find-in-set-vs-in – DevlshOne

+0

blufeet - 我需要這種方式 –

回答

1

我不知道爲什麼我違反數據庫規範化的基本原則......每個用戶通常有一個技工或最多2或3,所以我決定將數據存儲在用戶表中。

我找到解決方案基於@Marc B:

SELECT count(*) FROM users a 
INNER JOIN mechanics b 
ON (FIND_IN_SET(b.id, a.mechanic_id) > 0) 
WHERE b.id = '{$id}' 
group by b.id 
1

最好的解決辦法:廢舊此表的設計,並用適當的標準化改造一次。然後,一個簡單的join + group + count查詢就可以工作。

最壞的解決方案:使用MySQL的find_in_set()功能:

SELECT mechanics.id, COUNT(user_ID) 
FROM mechanics 
LEFT JOIN users ON (FIND_IN_SET(mechanics.id, users.mechanic_id) > 0) 
GROUP BY mechanics.id 
+0

我將你的解決方案與我的組合,它正在工作......謝謝! –

0
SELECT COUNT(user_Id) 
FROM users, mechanics 
WHERE mechanics.id IN (users.mechanic_id)