MySQL COUNT几个表中的行数不同?

时间:2014-08-16 04:14:20

标签: php mysql sql sql-server

好吧,这个人已经把我困扰了大约3个小时了,我无法理解它。

我这里有三张不同的牌桌。表1包含与工作相关的配件的信息。表二载有实际的工作信息。表三基本上只是化妆品信息。

partsdata
+-------+--------+------------+
| jobid | partid | categoryId |
+-------+--------+------------+
|     0 |      2 |          1 |
|     2 |      2 |          1 |
|     2 |      4 |          1 |
|     2 |      8 |          1 |
|     2 |     33 |          6 |
|     2 |     12 |          3 |
|     3 |      1 |          1 |
|     3 |      1 |          1 |
|     3 |      5 |          3 |
|     4 |      7 |          1 |
|     4 |     12 |          3 |
|     5 |     27 |          1 |
|     8 |      2 |          1 |
+-------+--------+------------+

quotes
+-------+----------------------------+
| jobid | customername               |
+-------+----------------------------+
|     0 | Mac                        |
|     2 | Ray & Angie                |
|     3 | Jim                        |
|     5 | Ray & Angie                |
|     6 | Susan                      |
|     8 | Mac                        |
|     9 | Dick                       |
+-------+----------------------------+

category
+-------+-------------------+
| catId | category          |
+-------+-------------------+
|     1 | category_1        |
|     2 | category_2        |
|     3 | category_3        |
|     4 | category_4        |
+-------+-------------------+

需要的是一个查询,它将按客户名分组列出客户在每个类别的DB中有多少报价的列表。 I.E.查询在数据库中查看并看到Mac有两个作业,这些作业中的所有部分都在catid1中,这意味着他有两个作业用于category_1。雷&安吉有两份工作,但他们有两个不同类别的部分。这意味着Ray& Angie在category_1中有2个职位,在category_3中有1个职位。

 +--------------+-------------+---------+
 | customername | category    | numJobs |
 +--------------+-------------+---------+
 |  Mac         | category_1  | 2       |
 |  Ray & Angie | category_1  | 2       |
 |  Ray & Angie | category_3  | 1       |
 |  Jim         | category_1  | 1       |
 |  Jim         | category_3  | 1       |
 +--------------+-------------+---------+

到目前为止我尝试过的是从部件表中提取数据然后再加入其他表,然后使用COUNT使用这样的查询来获取numJobs ......

SELECT DISTINCT q.customername, COUNT(*) AS numOrders, c.category AS category 
FROM partsdata p
INNER JOIN category c ON p.category = c.catid
INNER JOIN quotes q ON p.jobid = q.jobID
GROUP BY q.customername, c.category

但这当然给了我错误的数量。我对如何得到它绝对感到难过。我觉得我只是错过了一些愚蠢的东西。帮助

1 个答案:

答案 0 :(得分:0)

只需调整COUNT()即可计算不同的jobID。这样,重复的partID就不会影响计算的行数。

SELECT q.customername, COUNT(DISTINCT p.jobid) AS numOrders, c.category AS category
  FROM partsdata p
  INNER JOIN category c ON p.categoryId = c.catid
  INNER JOIN quotes q ON p.jobid = q.jobID
  GROUP BY q.customername, c.category;

+--------------+-----------+------------+
| customername | numOrders | category   |
+--------------+-----------+------------+
| Jim          |         1 | category_1 |
| Jim          |         1 | category_3 |
| Mac          |         2 | category_1 |
| Ray & Angie  |         2 | category_1 |
| Ray & Angie  |         1 | category_3 |
| Ray & Angie  |         1 | category_6 |
+--------------+-----------+------------+