【发布时间】:2018-03-30 13:58:00
【问题描述】:
我需要计算 product_rec_id 匹配、分配两个或多个供应商名称的次数。
例如,当用户输入 sarsa 和 bobbie25 时,我应该从下面的示例供应商表格中获得值计数 1。
这就是我所拥有的,对我来说奇怪的是,这两种方法适用于关键字的表格,但不适用于供应商的表格,Count 总是返回值 0。这些表格实际上是相似的,可能是什么问题?
SELECT
Count(distinct product_rec_id)
FROM
vendors
INNER JOIN vendors_products ON vendors_products.vendor_rec_id = vendors.vendor_rec_id
WHERE
(vendors.name LIKE '%sarsa%') AND
(vendors.name LIKE '%bobbie25%')
对于 Firebird 3,我将 Then 1 更改为 Then True。
SELECT
Count((CASE
WHEN vendors.name LIKE '%sarsa%'
THEN 1
END) AND (CASE
WHEN vendors.name LIKE '%bobbie25%'
THEN 1
END)) AS TRows
FROM
vendors
INNER JOIN vendors_products ON vendors_products.vendor_rec_id = vendors.vendor_rec_id
WHERE
(vendors.name LIKE '%sarsa%' OR
vendors.name LIKE '%bobbie25%')
-
CREATE TABLE vendors (
vendor_rec_id INTEGER PRIMARY KEY NOT NULL,
company_broker_id INTEGER NOT NULL,
name VARCHAR (50) NOT NULL,
vendor_id VARCHAR (50),
store_url VARCHAR (255),
website_url VARCHAR (255)
);
CREATE TABLE vendors_products (
product_rec_id INTEGER NOT NULL,
vendor_rec_id INTEGER
);
-
vendors' table data:
60 2 bobbie25 73658 http://www.somewebsite.com/ http://www.somewebsite.com/
43 2 sarsa 61688 http://www.somewebsite.com/ http://www.somewebsite.com/
-
CREATE TABLE keywords (
keyword_rec_id INTEGER PRIMARY KEYNOT NULL,
keyword VARCHAR (50) NOT NULL UNIQUE,
chart INTEGER NOT NULL
DEFAULT 0
);
CREATE TABLE keywords_products (
keyword_rec_id INTEGER NOT NULL,
product_rec_id INTEGER
);
vendors 表中的 vendor_rec_id 和 name 字段如下所示,这是 vendors 表的示例(永远不会有任何空值):
vendor_rec_id name
-------------- -----------
60 bobbie25
43 sarsa
87 johnf
vendors_products 表中的 vendor_rec_id 和 product_rec_id 如下所示(一个供应商名称可以分配给多个产品)(永远不会有任何空值):
vendor_rec_id product_rec_id
-------------- --------------
43 1
60 1
43 2
87 3
【问题讨论】:
-
在您的第一个查询中,vendor.names 是否应该同时类似于
'%sarsa%' AND '%bobbie25%'?它可以是 1 中的任何一个,并且计数将始终为 0。 -
那么为什么它可以毫无问题地使用关键字的表格呢?它总是按我的预期计算。
-
vendors表的内容是什么,请更明确哪些有效,哪些无效。以及您的期望以及原因。正如您在上一个问题中提到的,您使用count(case ... and case ...)的整个构造没有多大意义,但我们不能提出替代方案,因为目前还不清楚您真正想要做什么。同样在您提到的文本中“当用户进入混战和科幻时”,但您的示例过滤了供应商名称。请让您的问题自洽。 -
我编辑了我的问题。
-
问题在于,您所呈现的条件只会计算两个条件都为真在同一行的行,而这永远不会是案子。为什么计数不够好?
标签: sql sqlite count firebird-3.0