我有以下架构:
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,因为每个产品都安装在一个实时服务器上。
我做错了什么?如何实现这种行为?
答案 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引用它们......但这是一个全新的乐趣。