我的问题是我需要找到两家公司之间交换超过2次的客户,所以:
我们有公司A和B与Ids,例如1和2。 客户端已从公司A交换到B,它已记录到另一个表历史记录。
现在我需要选择从A公司到B公司从B公司换到A,然后再从A公司换到B公司(最后两个掉期)的客户
我需要说我不知道该怎么做。有任何想法吗? 非常感谢你的每一个答案。
编辑:
@jarlh示例:
Table Clients
ID Name CompanyId
1 Pikachu 63
2 Mew 34
3 Reptide 63
表历史
ID ClientId CompanyId
1 1 34
2 1 63
3 1 34
4 1 63
5 2 34
6 2 73
7 2 34
8 2 34
9 3 34
10 3 84
11 3 63
12 3 34
13 3 34
14 3 63
结果:
Id ClientId
1 1
2 3
答案 0 :(得分:1)
如果您的两家公司是固定的,并且您只想要一个方向A-> B-> A并且不关心B-> A-> B,您可以从历史中找到所有这些B公司之前和之后都有A公司存在。
类似的东西:
SELECT * FROM HistoryTable ht
WHERE CompanyID = 63
AND EXISTS (SELECT * FROM HistoryTable h1
WHERE h1.ClientID = ht.ClientID
AND h1.CompanyID = 34
AND h1.ID < ht.ID)
AND EXISTS (SELECT * FROM HistoryTable h2
WHERE h2.ClientID = ht.ClientID
AND h2.CompanyID = 34
AND h2.ID > ht.ID)
编辑:通过3次互换,它会变得更复杂:
SELECT * FROM HistoryTable ht
WHERE CompanyID IN (63,34)
AND EXISTS (SELECT * FROM HistoryTable h1
WHERE h1.ClientID = ht.ClientID
AND h1.CompanyID IN (34,63)
AND h1.CompanyID <> ht.CompanyID
AND h1.ID < ht.ID)
AND EXISTS (SELECT * FROM HistoryTable h2
WHERE h2.ClientID = ht.ClientID
AND h2.CompanyID IN (34,63)
AND h2.CompanyID <> ht.CompanyID
AND h2.ID > ht.ID
AND EXISTS (SELECT * FROM HistoryTable h3
WHERE h3.ClientID = h2.ClientID
AND h3.CompanyID IN (34,63)
AND h3.CompanyID <> h2.CompanyID
AND h3.ID > h2.ID))
我还为两个方向的互换添加了。 在A-> B-> A-> B的情况下,ht表应该代表B-2nd公司,我们检查它之前是否存在A(h1),以及它之后是否存在A(h2)自己也有B(h3)
答案 1 :(得分:1)
最简单的方法就是将历史表连接4次并使用连接以及过滤结果的位置。它会起作用,但在性能方面非常糟糕。只有在您没有大量数据或没有匆忙的情况下才能使用它。
.hide .detail-view-table thead > tr > th.detail,
.hide .detail-view-table tbody > tr:not(.detail-view) > td:first-of-type {
display: none;
}