有没有办法在MySQL中表达以下查询:
让表格具有行A,B,C,D,E ... Z的类型,每行代表一个事件。找到按时间戳排序的所有事件序列A,..,B,...,C的时间戳和id,以便时间戳(C) - 时间戳(A)< THRESH。
例如,请考虑下表
let viewHeight: CGFloat = 80.0
func scrollViewWillBeginDragging(scrollView: UIScrollView) {
startContentOffsetY = scrollView.contentOffset.y
}
func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
targetContentOffsetY = targetContentOffset.memory.y
if startContentOffsetY - targetContentOffsetY < 0 {
scrollDirection = ScrollDirection.Bottom.rawValue
} else {
scrollDirection = ScrollDirection.Top.rawValue
}
let gap = targetContentOffsetY % viewHeight
var offset: CGFloat = 0.0
if (targetContentOffsetY - gap) % viewHeight == 0 {
offset = -gap * scrollDirection
} else {
offset = gap * scrollDirection
}
let newTarget = targetContentOffsetY + (offset * scrollDirection)
targetContentOffset.memory.y = newTarget
}
具有Thresh = 10mins的查询的行应该产生以下行:
| type | timestamp | id |
|------+-----------+-----|
| Z | 19:00 | 20 |
| A | 19:01 | 21 |
| | | |
| . | ... | .. |
| | | |
| A | 20:13 | 50 | *
| B | 20:14 | 51 | *
| D | 20:17 | 52 |
| C | 20:19 | 53 | *
| | | |
| . | ... | .. |
| | | |
| A | 22:13 | 80 | *
| D | 22:14 | 81 |
| B | 22:15 | 82 | *
| K | 22:16 | 83 |
| J | 22:17 | 84 |
| C | 22:19 | 85 | *
| | | |
| . | ... | .. |
| | | |
| A | 23:13 | 100 |
| B | 23:14 | 101 |
| C | 23:50 | 102 |
了解A,B和C的最后一个三联体是如何存在的。最后一个A事件和最后一个C事件之间的时间距离大于Thresh。
我怀疑答案是“如果你需要问这类问题,MySQL不是正确的工具”。在这种情况下,后续是,哪个数据库是处理此类任务的良好候选者?
编辑:提供了一个示例
答案 0 :(得分:2)
我认为您可以使用自我加入来表达这一点:
SELECT A.id as A_id, B.id as B_id, C.id as C_id
FROM (
SELECT *
FROM the_table
WHERE type = 'A'
) A
JOIN (
SELECT *
FROM the_table
WHERE type = 'B'
) B
JOIN (
SELECT *
FROM the_table
WHERE type = 'C'
) C ON (
(C.timestamp - A.timestamp) < 10 -- threshold here
AND B.timestamp BETWEEN A.timestamp AND C.timestamp
)