所以我们有一个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/d
,a/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做它那么优雅。
答案 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和 - / - / - / -
我认为这就是一切