【发布时间】:2017-01-09 17:46:02
【问题描述】:
我正在尝试使用 SQL 方言来解析一组记录。具体来说,我想计算我的日志中出现的包含各种 id(单词)的记录数。我还想计算这些 id 出现的总次数。
数据存在于两个不同的表中:
-
id_status - 包含
id,status的表。 -
request_records - 包含请求记录的表。
id可能在给定记录中出现多次。
id_status
此表包含 id 及其当前状态。
id, status
sessions, ACTIVE
visits, DEPRECATED
duration, ACTIVE
...
request_records
句子记录可能包含超过 30 万条记录:
request
example.com/api?foo=sessions
example.com/api?bar=session%2Cvisits,foo=sessions
example.com/api?bar=duration,visits
example.com/api?foo=sessions
example.com/api?foo=visits,bar=visits
...
目标
我想创建一个包含四列id,status,occurence_count,record_count 的表。
-
occurence_count: 应该是 id 在所有记录中出现的总次数。 -
recourd_count:应该是特定id出现的记录总数。
根据上述示例,我将生成下表:
id, status, occurence_count, recourd_count
sessions,ACTIVE,3,2
visits,DEPRECATED,4,3
duration,ACTIVE,1,1
SQL
有没有办法构造一个返回所需表的 SQL 查询?我会知道如何用 Python 或任何其他语言相当容易地做到这一点,但如果可能的话,我想写一个 SELECT 语句来生成这个表。
更新:如下所示,我已尝试执行以下操作:
SELECT ids.id, ids.status,
SUM(length(request) - LENGTH(replace(request, ids.id, ''))) / LENGTH(ids.id) as occurence_count,
COUNT(reqs.request) AS recourd_count
FROM id_status ids LEFT JOIN
request_records reqs
ON find_in_set(ids.id, reqs.requests) > 0
GROUP BY ids.id, ids.status;
但是我的 SQL 方言不允许这种类型的连接并返回以下错误:
ON clause must be AND of = comparisons of one field name from each table, with all field names prefixed with table name.
添加了Sample Schema的SQL Fiddle:
CREATE TABLE id_status
(`id` varchar(32), `status` varchar(32))
;
INSERT INTO id_status
(`id`, `status`)
VALUES
('sessions', 'ACTIVE'),
('visits', 'DEPRECATED'),
('duration', 'ACTIVE')
;
CREATE TABLE request_records
(`request` varchar(500))
;
【问题讨论】:
-
您想要完全匹配的单词吗?比如sentencerecord表的第一条记录,是计算一次还是两次?
-
@karan Shah:所以,我正在寻找单词出现的总次数和记录数。所以第一条记录将使总计数增加 2,并且按 1 记录发生次数。
-
我想你已经得到了答案,如果你需要再看看,请告诉我
-
@Strawberry,我已经更新了问题,将SQL Fiddle sample Schema 包含在建议的解决方案失败的情况下,并将问题重新表述得更清楚。请重新打开或提供有关如何改进问题以使其可回答的更多详细信息?