我正在使用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
答案 0 :(得分:0)
如果我们总是要返回count
的值1,而当行数的计数大于1时...则我们实际上并没有返回计数。
名称的模式是什么...它们以数字和字母结尾还是下划线字符也很重要?
使用12345a
或5678_b2
或11_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查询生成器中要实现什么。