2013-07-23 40 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)