MySQL:将内容相似但未重复的行计为1

时间:2019-05-30 14:16:48

标签: mysql

我正在使用Codeigniter及其查询生成器类,其中有一个包含ID和名称的表。
这些名称看起来像1234_1a或2345_2a,其中1a可以是1b或2a,2b,3a ...依此类推。

现在,我要计算所有这些“ 1234”和“ 2345”,但将它们写为一种类型。

到目前为止,我尝试过:

class CustomProxyMiddleware(object):

    def process_request(self, request, spider):      
        request.meta['proxy'] = "http://proxy.com:8080"
        request.headers['Proxy-Authorization']=basic_auth_header(user,pass) 

但问题是:
如果有3456_2a但没有3456_1a,怎么办呢?

$this->db->like('names', '1a', 'before');
$this->db->or_like('names', '1b', 'before');
return $this->db->count_all_results('table');

这就是我想要的:

id  name
2   1212_1a
3   1243_1a
7   3142_1a
24  1243_2a
30  3142_2b
80  2315_2b
136 1243_3b
512 8562_1a

1 个答案:

答案 0 :(得分:0)

如果我们总是要返回count的值1,而当行数的计数大于1时...则我们实际上并没有返回计数。

名称的模式是什么...它们以数字和字母结尾还是下划线字符也很重要?

使用12345a5678_b211_22_3b之类的名称值怎么办?该如何处理?

在我看来,我们想使用这样的SQL查询:

SELECT SUBSTRING_INDEX(t.name,'_',1)  AS `foo`
     , 1                              AS `count`
  FROM ( 
         SELECT 2 AS `id`, '1212_1a' AS `name`
         UNION ALL SELECT 3, '1243_1a'
         UNION ALL SELECT 7, '3142_1a'
         UNION ALL SELECT 24, '1243_2a'
         UNION ALL SELECT 30, '3142_2b'
         UNION ALL SELECT 80, '2315_2b'
         UNION ALL SELECT 136, '1243_3b'
         UNION ALL SELECT 512, '8562_1a'
       ) t
 GROUP BY `foo`
 ORDER BY `foo`

内联视图(派生表)在用于测试的查询中。将其替换为表引用:

SELECT SUBSTRING_INDEX(t.name,'_',1)  AS `foo`
     , 1                              AS `count`
  FROM mytable t
 GROUP BY `foo`
 ORDER BY `foo`

可能需要调整foo的表达式,以使用不遵循常规模式的值获得理想的行为。考虑不带下划线,下划线超过一个且结尾不是数字的名称值。我们还可以包含一个WHERE子句,以排除不遵循该模式的行

WHERE t.name REGEXP '_[0-9][a-z]$'

(仅name以下划线,数字,小写字母结尾的值)。

如果没有经过测试的SQL查询,我将不知道在CodeIgniter查询生成器中要实现什么。