groupby与列字段具有相似列

时间:2016-08-23 11:02:02

标签: php mysql laravel

我正在使用group by for like statement,因为我有这样的数据库结构。

enter image description here

我想得到workzone groupby的计数。但是如果我尝试分组,那么输出会出现错误输出,因为输出将按99和99分组,如图所示。

enter image description here

我的sql代码是:

select count(organization),working_zone from `projects` where `district` = 12 and (`working_zone` = 99 or `working_zone` LIKE "99," or `working_zone` LIKE ",99") group by `organization`;

我想要的结果是:

count | working_zone

____ 6 | 99

____ 3 | 100

(99),(,99),(99,)应按总和进行分组,结果应为6.

2 个答案:

答案 0 :(得分:1)

你有一个糟糕的数据结构 - 虽然我不会感到惊讶,如果数据是好的,你真的在​​处理一个(合理的)查询的结果。您不应该将原始数据存储在逗号分隔的列表中。相反,请使用联结表。

为什么每对都有一个单独的行SQLish存储数据的方式?考虑以下原因:

  • SQL具有相当基于字符串的函数(与其他编程环境相比)。
  • 数据应以其原生类型存储;不要将数字存储为字符串。
  • 应明确声明外键关系,并且不能使用逗号分隔的字符串声明外键关系。
  • 优化查询的主要SQL机制是索引,逗号分隔的列表排除了索引的使用。

但是,有时候,你会遇到别人糟糕的设计决定。如果是这样,一个解决方案使用工作区表:

SELECT prod.prod_id, prod.name, prod.price, MAX( prodlist.date_created) 
FROM t_products_lists prodlist 
INNER JOIN t_products prod ON prodlist.prod_id = prod.prod_id 
WHERE prodlist.date_created < CONVERT(DATETIME,'01.01.2016 23:59:59.997',0) 
GROUP BY prod.prod_id, prod.name, prod.price

答案 1 :(得分:1)

SELECT COUNT(organization),working_zone FROM table WHERE working_zone HAVING '99'
UNION ALL
SELECT COUNT(organization),SUBSTRING(working_zone,4) FROM table WHERE working_zone = '99,100'