如何通过其中一个字段中的子字符串计算记录

时间:2016-02-05 09:46:02

标签: 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_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,因为每个产品都安装在一个实时服务器上。

我做错了什么?如何实现这种行为?

2 个答案:

答案 0 :(得分:4)

稍微打破你的查询。取消集团和计数,你会看到发生了什么:

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

所以你真正想要的是:

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(*)选择有多少条记录 您按产品名称进行分组,因此每个产品名称都会有一行,而count会计算该产品名称的记录数。

WHERE过滤器意味着您只获取公司名称为'%Live%'的记录(这是您的问题所针对的)。

现在,count(*)将显示每个product_name的记录数,满足该标准。

假设您想要每个产品的实时和演示行数。我在表格中添加了一些行来演示这一点。 foo现在看起来像这样:

third_company |演示another_product first_company |直播some_product first_company |演示some_product second_company | Live another_product fourth_company |演示another_product fourth_company |演示a_third_product

所以,如果你的查询中有一列

company_name like '%Live%'

如果它不像Live,它将返回0,如果它不是,则返回1。现在,按产品名称进行分组,你想要的是SUM那个列,所以你得到的行数是真的:

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
;

返回:

another_product 1   2
some_product    1   1
a_third_product 0   1

似乎你一直想要总结!

答案 1 :(得分:1)

不要在同一个字段中存储两条信息!否则,您可能会遇到更快的可读性,查询复杂性和性能问题,而不是“瓶颈”。

你可以很容易地将它们分开,例如:

<?php

function get_background_colour()
{
    $colours = array(
        'red' =>   '#FF0000',
        'green' => '#00FF00'
    );

    $raw_colour = filter_input(INPUT_GET, 'colour');

    if($raw_colour && array_key_exists($raw_colour, $colours)) {
        $colour = $colours[$raw_colour];
    } else {
        $colour = $colours[array_rand($colours)];
    }

    return $colour;
}

$colour = get_background_colour();
echo $colour;

然后,查询变得更简单:

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);

您可能应该将您的公司和产品存储在不同的表格中并通过ID引用它们......但这是一个全新的乐趣。