使用结果计算类别组

时间:2016-08-31 08:37:30

标签: php mysql drupal grouping category-theory

所以我们有一个Drupal站点,其节点标记在4个词汇表中。在SQL术语中,这些都是基表上的简单连接。简而言之,它看起来大致如下:

SELECT a.name AS location, b.name AS sector, c.name AS tag, d.name AS status
FROM node n
LEFT JOIN a ON a.id = n.id
LEFT JOIN b ON b.id = n.id
LEFT JOIN c ON c.id = n.id
LEFT JOIN d ON d.id = n.id
WHERE n.type = 'X'
GROUP BY a.name, b.name, c.name, d.name

我们有一个列表页面,您可以按A,B,C和D过滤;每个都有一个所有值的列表和一个" All"选项。

我们需要的是A,B,C和D 的不同组合列表,其中包含结果。这是为了生成站点地图,显然,我们不想引导机器人清空结果页面。

我尝试过使用WITH ROLLUP并获得部分成功。这为我提供了a/b/c/da/b/c/*a/b/*/*a/*/*/**/*/*/*。但是它不会*/*/*/d*/b/*/**/b/*/d(以及所有类似组合)。

有关使用此方法使用SQL是否可行的任何建议?我不会厌恶使用子查询。

我们的替代理论是遍历所有节点并在PHP中构建一个数组,其中包含节点所在的所有组合。例如:如果节点1在a/b/c/d中,那么我们的数组将添加以下内容

[
  'a/b/c/d',
  'a/b/c/*',
  'a/b/*/d',
  'a/*/c/*',
  'a/*/c/d',
  'a/*/*/*',
  '*/*/*/d',
  '*/b/c/d',
  '*/b/c/*',
  '*/b/*/d',
  '*/*/c/*',
  '*/*/c/d',
  '*/*/*/*',
  '*/*/*/d',
  '*/*/*/*',
]

(我认为这就是所有组合)。

最后,这些唯一的一组将是所有可用的路径/选项,没有任何空的路径/选项。我想。

这显然是一种蛮力的做法。感觉它会起作用,但感觉不如用SQL做它那么优雅。

1 个答案:

答案 0 :(得分:0)

编辑:这不起作用,我很确定并非所有结果

嗯......刚试了这个,看起来你可以通过使用2个查询得到所有可能的结果,在每个方向分组:

即GROUP BY a.name,b.name,c.name,d.name

然后GROUP BY d.name,c.name,b.name,a.name

但后来我尝试在一个查询中添加这两个分组方向,看起来很有希望:

即GROUP BY a.name,b.name,c.name,d.name,c.name,b.name,a.name

我认为这有效但可能有更好的方法。

我使用4个查询来获取所有结果,如下所示:

SELECT a.name AS location, b.name AS sector, c.name AS tag, d.name AS status
FROM node n
LEFT JOIN a ON a.id = n.id
LEFT JOIN b ON b.id = n.id
LEFT JOIN c ON c.id = n.id
LEFT JOIN d ON d.id = n.id
WHERE n.type = 'X'
GROUP BY a.name, b.name, c.name, d.name
SELECT b.name AS sector, c.name AS tag, d.name AS status
FROM node n
LEFT JOIN b ON b.id = n.id
LEFT JOIN c ON c.id = n.id
LEFT JOIN d ON d.id = n.id
WHERE n.type = 'X'
GROUP BY b.name, c.name, d.name
SELECT c.name AS tag, d.name AS status
FROM node n
LEFT JOIN c ON c.id = n.id
LEFT JOIN d ON d.id = n.id
WHERE n.type = 'X'
GROUP BY c.name, d.name
SELECT d.name AS status
FROM node n
LEFT JOIN d ON d.id = n.id
WHERE n.type = 'X'
GROUP BY d.name

所以第一个查询返回所有结果,其中所有4个类别都有一个值,即a / b / c / d,并且汇总将它们添加到/ b / c / - ,a / b / - / - ,a / - / - / - (连字符用于所有过滤器值,当我因某种原因键入时,星号消失)

然后第二个查询返回* / b / c / d的所有内容,并且汇总添加 - / b / c / - , - / b / - / -

第三个返回 - / - / c / d并且汇总添加 - / - / c / -

然后第四个添加 - / - / - / d和 - / - / - / -

我认为这就是一切