【发布时间】:2018-10-21 14:27:00
【问题描述】:
我正在使用相当复杂的数据库架构构建报表。我有以下表格(为简洁起见进行了简化)。
Table: search_data
------------------------------------------
id partNumber clei searchDate
------------------------------------------
1 NT9X null 2017-10-15
2 NT9X ENBYAAAAAA 2017-11-11
3 null ENBYAAAAAA 2017-11-12
4 NT9X null 2017-11-15
5 NNTM null 2017-11-15
------------------------------------------
Table: analytics
--------------------------------------------
id partNumber clei num_searches
--------------------------------------------
1 NT9X ENBYAAAAAA 0
2 EFGH EEEFFHI 0
3 NT9X null 0
4 null ENBYAAAAAA 0
部件有 2 个标识符:partNumber 和 CLEI
所以这将是相同的部分:
- 克莱:ENBYAAAAAA
- 部件号:NT9X
搜索进入 search_data 表,用户可以通过 partNumber、CLEI 或两者进行搜索。因此对于上面列出的部分,您可以在 search_data 中看到该部分已被搜索了 4 次(ids 1、2、3 和 4)。
我需要使用该部件号 OR CLEI 的搜索次数更新 analytics 表的 num_searches 列。
所以更新后,analytics 表应该是这样的:
--------------------------------------------
id partNumber clei num_searches
--------------------------------------------
1 NT9X ENBYAAAAAA 4
2 EFGH EEEFFHI 0
3 NT9X null 4
4 null ENBYAAAAAA 4
我为此创建了一个有效的连接。
SELECT *
FROM analytics_data a
join search_data s
on
case when a.partNumber is not null and a.partNumber != '' THEN a.partNumber = s.partNumber END
OR
case when a.clei is not null and a.clei != '' THEN a.clei = s.clei END
我使用 CASE 语句来说明两个表中可能同时存在也可能不存在 partNumber 和 CLEI 的事实。当 clei 在分析中为 NULL 时,一个简单的 a.clei = s.clei 语句将在搜索中为我提供每行具有 NULL clei 的信息,而不管 partNumber 是什么。
这种困境使更新变得困难。我想出了这个更新声明。我不确定它是否有效,因为它不会完成。几分钟后我将其杀死,因为这不是可接受的运行时间。
update analytics a
set a.num_searches =
(
select count(*) from search_data s where
(case when a.partNumber is not null and a.partNumber != ''
THEN a.partNumber = s.partNumber END
OR
case when a.clei is not null and a.clei != '' THEN a.clei =
s.clei END)
)
我不知道从这里去哪里。这似乎是一项简单的任务,但我已经厌倦了用头撞桌子。
有什么想法吗?
================================================ ==========================
解决 Nick 提出的解决方案的其他详细信息。
我担心的是这些部分需要多次迭代。一个零件可以有一个基本代码,如“NT9X”,加上各种系列代码(2 个字符),再加上另一种特征代码(另外 2 个字符)。
所以我们可以有
NT9X
NT9XAB
NT9XBB
NT9XABAA
NT9XABBB
等等。所有都是相同的一般部分,但功能略有不同。还有很多零件号/CLEI 组合。同一个零件号可以有多个 CLEI 代码,反之亦然。
因此,我们不得不进行大量 LIKE 查询。如果我想获得 NT9X 部分的所有报价,我有一个类似的查询...
SELECT * FROM part_quotes WHERE partNumber LIKE 'NT9X%';
它适用于 1 部分。但是对于像现在这样的例子,我有一个包含 6000 多个零件的列表,并且我需要来自十几个不同表的数据来生成报告,这只是不可能用单个查询来完成。
因此,对于您的方案,我必须对 part_numbers 表执行 LIKE 查询,以获取所有可能的部分匹配项。然后,我必须在 part_id 的表连接中使用 IN 子句。
如果不对其进行测试,我不知道它是否会或多或少有效。
我有很多存储零件信息的表格。像...这样的表格
vendor_quotes
internal_quotes
search_results
search_data
sales_history
repair_pricing
pricing
purchase_history
expenses
还有更多。试图构建一个报告,我必须在这么多表和聚合数据上进行通配符搜索,这非常令人头疼。我肯定需要一种更好的方法来做到这一点,并将在不久的将来测试您的解决方案。
【问题讨论】:
-
我没有完全得到你的结果。 “4”从何而来?我认为结果应该是 4、0、3、2。
-
4 是因为 PN: NT9X 和 CLEI: ENBYAAAAAA 是同一部分。对其中任何一个的任何搜索都是双向的。 ENBYAAAAAA 是搜索 NT9X,搜索 NT9X 是搜索 ENBYAAAAAA。
标签: mysql sql join count sql-update