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