获取具有多种组合的行数

时间:2018-12-18 16:48:17

标签: mysql sql

我需要有关MySQL查询的帮助。我们有一个数据库(约1万行),我已经简化了这个问题。

我们有7位卡车司机每天访问9个地点中的3个。每天他们访问的地点恰好是3个不同的地点,每天他们可以访问的地点与前一天不同。以下是代表性表格:

Table: Drivers

id name
10 Abe
11 Bob
12 Cal
13 Deb
14 Eve
15 Fab
16 Guy

Table: Locations

id day address driver.id
1   1    Oak   10
2   1    Elm   10
3   1    4th   10
4   1    Oak   16
5   1    4th   16
6   1    Toy   16
7   1    Toy   11
8   1    5th   11
9   1    Law   11
10   2    Oak   11
11   2    4th   11
12   2    Toy   11   
.........

我们拥有一整年的数据,我们需要找出一年中每次访问“路线”的次数(从最大到最小)。

根据我的高中数学,我相信有9!/(6!3!)条路线组合,或总共84条。我想做类似的事情:

获取路由地址为“ Oak”,“ Elm”和“ 4th”的路由计数

然后再次运行 路由地址=“橡树”,“榆树”和“第5”

然后一次又一次,依此类推。然后对路由计数进行降序排列。但是我不想做84次。有办法吗?

1 个答案:

答案 0 :(得分:1)

我会看GROUP_CONCAT

 SELECT t.day 
      , t.driver
      , GROUP_CONCAT(t.address ORDER BY t.address)
  FROM mytable t
 GROUP
    BY t.day
     , t.driver

如果路线上的停靠点有命令,这里还不清楚。顺序会有所不同吗?如何知道顺序是什么?要提出不同的方法,请考虑以下两条路线:

('Oak','Elm','4th')('Elm','4th','Oak')

这些是否相等(因为它们是同一组停靠点)还是不同(因为它们处于不同的顺序)?

如果路线上的停靠点序列将其与其他具有相同停靠点(以不同顺序)的路线区分开,则将ORDER BY t.address替换为ORDER BY t.id或给出停靠点序列的任何表达式。

一些带有GROUP_CONCAT的警告:最大长度受group_concat_max_lenmax_allowed_packet变量设置的限制。另外,逗号用作分隔符...如果我们合并包含逗号的字符串,那么在我们的结果中,我们将无法可靠地区分'a,b' + 'c''a' + { {1}}


我们可以将该查询用作内联视图,并获得具有相同路由的行数的计数:

'b,c'