Mysql 如何通过其中一个字段中的子字符串统计记录
我有以下模式:Mysql 如何通过其中一个字段中的子字符串统计记录,mysql,sql,Mysql,Sql,我有以下模式: CREATE TABLE foo( company_name TEXT, product_name TEXT ); INSERT INTO foo VALUES("first_company|Live", "some_product"); INSERT INTO foo VALUES("first_company|Demo", "some_product"); INSERT INTO foo VALUES("second_company|Live", "another_
CREATE TABLE foo(
company_name TEXT,
product_name TEXT
);
INSERT INTO foo VALUES("first_company|Live", "some_product");
INSERT INTO foo VALUES("first_company|Demo", "some_product");
INSERT INTO foo VALUES("second_company|Live", "another_product");
INSERT INTO foo VALUES("third_company|Demo", "another_product");
我需要计算实时服务器和演示服务器上的产品数量,因此我首先尝试了以下查询来计算实时服务器的数量:
SELECT product_name, COUNT(SUBSTRING_INDEX(company_name, '|', 1) LIKE '%Live%') AS count
FROM `foo` GROUP BY product_name ORDER BY count DESC;
但它给了我以下结果:
product_name count
some_product 2
another_product 2
我希望这两个产品的count==1,因为它们都只安装在一台实时服务器上
我做错了什么?如何实现这样的行为?将您的查询分解一下。摆脱这群人和伯爵,你会看到发生了什么:
SELECT product_name, SUBSTRING_INDEX(company_name, '|', 1) like '%Live%' AS count
FROM `foo` ORDER BY count DESC;
返回
another_product 0
some_product 0
some_product 0
another_product 0
看看这是为什么:
SELECT product_name, SUBSTRING_INDEX(company_name, '|', 1) AS count
FROM `foo` ORDER BY count DESC;
another_product third_company
another_product second_company
some_product first_company
some_product first_company
请尝试:
SELECT product_name, company_name like '%Live%' AS count
FROM `foo` ORDER BY count DESC;
返回:
some_product 1
another_product 1
another_product 0
some_product 0
another_product 1 2
some_product 1 1
a_third_product 0 1
因此,您实际想要运行的是:
SELECT product_name, count(company_name like '%Live%')>0 AS count
FROM `foo`
group by product_name
ORDER BY count DESC;
它返回你想要的
你的问题是,你在做检查,然后计算所有结果,而不仅仅是在符合标准的地方
实际上,更好的方法是这样做,使计数函数的操作更清晰:
SELECT product_name, COUNT(*) AS count
FROM `foo`
where company_name LIKE '%Live%'
GROUP BY product_name ORDER BY count DESC;
所以count(*)选择有多少条记录
您是按产品名称分组的,因此每个产品名称对应一行,并计算有多少条记录使用该产品名称
WHERE筛选器意味着您只获取公司名称为“%Live%”的记录(这正是您的问题所要查找的)
现在,count(*)将显示满足该标准的每个产品名称有多少条记录
假设您想要实时和演示行中每个产品的计数。为了演示这一点,我在表中添加了一些行foo
现在看起来像这样:
SELECT product_name, COUNT(*) AS count
FROM `foo`
where company_name LIKE '%Live%'
GROUP BY product_name ORDER BY count DESC;
第三家公司演示另一种产品
first|u company|Live一些|u产品
第一家公司演示一些产品
第二家公司|生产另一种|产品
第四家|u公司|演示另一个|u产品
第四家公司演示第三家公司的产品
因此,如果查询中有一列
company_name like '%Live%'
如果与Live不同,则返回0;如果与Live不同,则返回1。现在,按产品名称分组,您想要的是对该列求和,这样您就得到了正确的行数:
SELECT
product_name,
sum(company_name like '%Live%') AS count_live,
sum(company_name like '%Demo%') AS count_demo
FROM `foo` group by product_name
;
返回:
some_product 1
another_product 1
another_product 0
some_product 0
another_product 1 2
some_product 1 1
a_third_product 0 1
看来你一直都想要总和 将您的查询细分一点。摆脱这群人和伯爵,你会看到发生了什么:
SELECT product_name, SUBSTRING_INDEX(company_name, '|', 1) like '%Live%' AS count
FROM `foo` ORDER BY count DESC;
返回
another_product 0
some_product 0
some_product 0
another_product 0
看看这是为什么:
SELECT product_name, SUBSTRING_INDEX(company_name, '|', 1) AS count
FROM `foo` ORDER BY count DESC;
another_product third_company
another_product second_company
some_product first_company
some_product first_company
请尝试:
SELECT product_name, company_name like '%Live%' AS count
FROM `foo` ORDER BY count DESC;
返回:
some_product 1
another_product 1
another_product 0
some_product 0
another_product 1 2
some_product 1 1
a_third_product 0 1
因此,您实际想要运行的是:
SELECT product_name, count(company_name like '%Live%')>0 AS count
FROM `foo`
group by product_name
ORDER BY count DESC;
它返回你想要的
你的问题是,你在做检查,然后计算所有结果,而不仅仅是在符合标准的地方
实际上,更好的方法是这样做,使计数函数的操作更清晰:
SELECT product_name, COUNT(*) AS count
FROM `foo`
where company_name LIKE '%Live%'
GROUP BY product_name ORDER BY count DESC;
所以count(*)选择有多少条记录
您是按产品名称分组的,因此每个产品名称对应一行,并计算有多少条记录使用该产品名称
WHERE筛选器意味着您只获取公司名称为“%Live%”的记录(这正是您的问题所要查找的)
现在,count(*)将显示满足该标准的每个产品名称有多少条记录
假设您想要实时和演示行中每个产品的计数。为了演示这一点,我在表中添加了一些行foo
现在看起来像这样:
SELECT product_name, COUNT(*) AS count
FROM `foo`
where company_name LIKE '%Live%'
GROUP BY product_name ORDER BY count DESC;
第三家公司演示另一种产品
first|u company|Live一些|u产品
第一家公司演示一些产品
第二家公司|生产另一种|产品
第四家|u公司|演示另一个|u产品
第四家公司演示第三家公司的产品
因此,如果查询中有一列
company_name like '%Live%'
如果与Live不同,则返回0;如果与Live不同,则返回1。现在,按产品名称分组,您想要的是对该列求和,这样您就得到了正确的行数:
SELECT
product_name,
sum(company_name like '%Live%') AS count_live,
sum(company_name like '%Demo%') AS count_demo
FROM `foo` group by product_name
;
返回:
some_product 1
another_product 1
another_product 0
some_product 0
another_product 1 2
some_product 1 1
a_third_product 0 1
看来你一直都想要总和 不要在同一字段中存储两条信息!否则,您将以比“瓶颈”更快的速度遇到可读性、查询复杂性和性能问题 您可以很容易地将其拆分,例如:
CREATE TABLE foo(
company_name TEXT,
product_name TEXT,
status TINYINT(1) NOT NULL,
);
INSERT INTO foo VALUES("first_company", "some_product", 1);
INSERT INTO foo VALUES("first_company", "some_product", 0);
INSERT INTO foo VALUES("second_company", "another_product", 1);
INSERT INTO foo VALUES("third_company", "another_product", 0);
然后,查询变得更简单:
SELECT product_name, SUM(status) AS live_count
FROM `foo`
GROUP BY product_name
ORDER BY live_count DESC;
您可能也应该将您的公司和产品存储在不同的表中,并通过id引用这些表。。但这是一个全新的乐趣。不要在同一个字段中存储两条信息!否则,您将以比“瓶颈”更快的速度遇到可读性、查询复杂性和性能问题 您可以很容易地将其拆分,例如:
CREATE TABLE foo(
company_name TEXT,
product_name TEXT,
status TINYINT(1) NOT NULL,
);
INSERT INTO foo VALUES("first_company", "some_product", 1);
INSERT INTO foo VALUES("first_company", "some_product", 0);
INSERT INTO foo VALUES("second_company", "another_product", 1);
INSERT INTO foo VALUES("third_company", "another_product", 0);
然后,查询变得更简单:
SELECT product_name, SUM(status) AS live_count
FROM `foo`
GROUP BY product_name
ORDER BY live_count DESC;
您可能也应该将您的公司和产品存储在不同的表中,并通过id引用这些表。。但这是一个全新的乐趣。您仍然需要调整您正在计算的内容。我知道您现在正在尝试做什么,将再次编辑。您将使用相同的模式,但使用一个更复杂的布尔值,即“sum(company_name不喜欢“%Live%”和company_name不喜欢“%Demo%”作为COUNT_other)sum在group by之后应用。组的元素被交给sum函数。这个问题的另一个答案解决了另一个问题,你应该将“x|U company | Live”分成两列,这将使计算更容易。你仍然需要调整你的计数。我明白你现在在做什么,将再次编辑。您将使用相同的模式,但使用更复杂的布尔值,即“sum(公司名称不象'%Live%'和公司名称不象'%Demo%')作为count_other”sum在分组依据后应用。组中的元素被交给求和函数。这个问题的另一个答案解决了另一个问题,你真的应该将“x|U company | Live”分成两个独立的列,这会让你更容易犯错?将Live/Demo存储在与公司名称相同的列中是个坏主意。你做错了什么?将Live/Demo存储在与公司名称相同的列中是个坏主意。此表已存在。我不知道作者为什么决定将这些信息存储在同一个数据库中field@FrozenHeart我的建议是:如果可以,改变结构。如果你不能,co