MySQL语法将一个表中的行计数与另一个表中的选择结果组合在一起

时间:2014-04-04 10:46:59

标签: mysql syntax subquery

在我的MySQL数据库中,我有两个表。

Table contact_groups:
+-------------+-----------+
| groupname   | fieldname |
+-------------+-----------+
| Wholesalers | grp_whs   |
| Retailers   | grp_rtl   |
| Consumers   | grp_cns   |
+-------------+-----------+

Table contacts:
+---------+---------+---------+---------+
| name    | grp_whs | grp_rtl | grp_cns |
+---------+---------+---------+---------+
| Tom     |       0 |       1 |       1 |
| Dick    |       1 |       0 |       0 |
| Harry   |       0 |       1 |       0 |
| John    |       0 |       1 |       1 |
| Jane    |       1 |       1 |       0 |
| Anna    |       1 |       0 |       0 |
| Bob     |       0 |       0 |       1 |
| Charlie |       0 |       1 |       1 |
+---------+---------+---------+---------+

我需要编写一个qyery,它会返回 contact_groups 表中的字段名称和组名称列表,其中联系人表中的名称数量与该组连接到组名。如果是上述数据,将返回以下内容:

+-----------+-----------------+
| fieldname | groupname       |
+-----------+-----------------+
| grp_whs   | Wholesalers (3) |
| grp_rtl   | Retailers (5)   |
| grp_cns   |  Consumers (4)  |
+-----------+-----------------+

(我需要以这种格式生成上述输出的单个查询的原因是该语句将由缺乏灵活性的表单生成器执行,并且只能执行必须以这种方式返回字段名和组名的单个查询。)

我该怎么做?

3 个答案:

答案 0 :(得分:1)

如果您希望ans采用此特定格式,请使用CONCAT(groupname,'(',value,')') 你会得到像批发商这样的东西(3)。

答案 1 :(得分:1)

这是我能想到的

select fieldname, concat(groupname,' (',
case
  when fieldname = 'grp_whs' then 
  (
     select sum(grp_whs) from contacts
  )  
  when fieldname = 'grp_rtl' then 
  (
     select sum(grp_rtl) from contacts
  ) 
  when fieldname = 'grp_cns' then 
  (
     select sum(grp_cns) from contacts
  ) 
END
,' )') as groupname
from contact_groups

点击这里

http://sqlfiddle.com/#!2/a235f/4

我假设你只有3个fieldname。如果还有更多,那么我不认为这是最好的解决方案,有人可能会对此有更好的了解。

但是对于你的情况,这应该有用。

答案 2 :(得分:0)

尝试...

  select fieldname ,

    case  fieldname 
       when 'grp_whs'
       then groupname  + '(' + convert(varchar(50),(select count(name) from contacts where grp_whs=1)) + ')'
       when 'grp_rtl'
       then groupname  + '(' + convert(varchar(50),(select count(name) from contacts where grp_rtl=1)) + ')'
       when 'grp_cns'
       then groupname  + '(' + convert(varchar(50),(select count(name) from contacts where grp_cns=1)) + ')'

    END as groupname

    FROM contact_groups