2016-08-31 6 views
0

그래서 우리는 4 개의 어휘로 태그 된 노드를 가진 Drupal 사이트를 가지고 있습니다. 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로 필터링 할 수있는 목록 페이지가 있습니다. 각각에는 모든 값 목록과 "모두"옵션이 있습니다.

결과가 인 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

나는이 문제가 쿼리와 관련이 없다고 생각한다. 문제는 데이터와 관련이 있다고 생각한다. 만약 당신의 질의가'*/*/*/d'를 반환하지 않는다면, 테이블에 같은 node.id를 가진 필수 레코드가 없다. SQL은 데이터베이스에있는 것을 반환하도록 설계되었지만 데이터베이스에없는 것은 아닙니다. – Shadow

+0

@Shadow - 이것은 롤업이 작동하는 방식입니다. 오른쪽에서 요약합니다. 내 항목이 카테고리 d에 있으므로 다른 모든 항목에 *가 포함됩니다. d. 당신이 옳습니다, 이것은 SQL 문제입니다 ... 그러나 나는 여기서 쿼리를 바꾸는 방법을 모릅니다. SQL은 모든 올바른 값을 리턴합니다. 예를 들어 그 노드의 경우'a/b/c/d' 행을, ROLLUP은'a/b/c/*','a/b/*/*','a/*/*/*'및'*/*/*/*'행을 포함합니다. ROLLUP은'*/*/*/d'를하지 않을 것입니다. – Nick

+0

테이블에 올바른 데이터가있는 경우 왜 '롤업'이 필요한지 알 수 없습니다. – Shadow

답변

0

편집 : 이것은 내가이 모든 결과

흠 ... 그냥 밖으로 시도하고 당신이이 쿼리를 사용하여 모든 가능한 결과를 얻을 수있는 것처럼 그룹화, 보이는 아니에요 확신 해요 작동하지 않습니다 a.name, b.name, c.name BY

즉 GROUP, d.name, c.name, b.name BY d.name

다음 GROUP, a.name

: 각 방향으로

하지만 하나의 쿼리에서 그룹화 방향을 모두 추가하려고 시도했지만 꽤 유망 해 보입니다.

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


나는이 작품 만이있을 수 있다고 생각 더 좋은 방법.

나는이 같은 모든 결과를 얻을 수 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/,/-/-/- (하이픈은 모든 필터 값에 해당합니다. 어떤 이유로 든 별표를 입력하면 별표가 사라집니다)

그런 다음 두 번째 쿼리는 */b/c/d에 대한 모든 내용을 반환하고 롤업합니다. 추가 -/B/C/- -/B/-/-

세번째 복귀

-/-/C/D 및 롤 업 추가 - /가 -/C/-

다음 네 번째 추가 -/-/-/d 및 -/-/- -

내가 생각하기에 모든 것

관련 문제