2016-08-31 10 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', 
    '*/*/*/*', 
] 

(私はすべての組み合わせthatsのだと思う)に追加された次のだろう。

これらの固有のセットは、最後にすべての空のパス/オプションなしのパス/オプションになります。おもう。

これは明らかに軽快なアプローチです。それはうまくいくように感じますが、SQLで行うよりもエレガントではないと感じます。

+0

私は実際にこの問題をクエリの問題としていませんが、問題はデータにあると思います。もしあなたのクエリが '*/*/*/d'を返さなければ、あなたはテーブルに同じ' node.id'を持つ必要なレコードを持っていません。 Sqlは、データベースにあるものを返すように設計されており、データベースには存在しません。 – Shadow

+0

@Shadow - これはWITH ROLLUPの仕組みです。右から要約します。私のアイテムはカテゴリdに存在するので、他のすべてのアイテムには*が含まれます。 これはSQLの問題だという点では正しいですが...ここで質問をどのように言い換えるかはわかりません。 SQLはすべての正しい値を返しています。たとえば、そのノードの場合、 'a/b/c/d'の行を取得し、ROLLUPは' a/b/c/* '、' a/b/*/* '、' a/*/*/* 'と' */*/*/* 'の行があります。 ROLLUPは '*/*/*/d'を実行しません。 – Nick

+0

テーブルに適切なデータがある場合、なぜロールアップが必要なのかわかりません。 – Shadow

答えて

0

EDIT:これは動作しません、私はそれがすべての結果が

うーん...ちょうどこのアウトを試してみましたが、あなたは2つのクエリを使用して、すべての可能な結果を​​得るかもしれないように見える、グループ分けではありませんかなり確信しています各方向:次いでa.name、b.name、c.name、d.name

BY

すなわちグループグループd.name、c.name、b.name、a.name

BY

しかし、1つのクエリでこれらのグループ化の両方の方向を追加しようとしましたが、かなり有望です:

すなわち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の値を持ち、ロールアップによってa/b/c/- 、a/b/、/// -/- (ハイフンはすべてのフィルタ値のため、アスタリスクは何らかの理由で入力すると消えます)

次に、2番目のクエリは*/b/c/dのすべてを返し、ロールアップします加算 -/B/C/- 、 -/B/-/-

第戻る -/-/C/Dとロール加算 -/-/C/-

は次に第が追加します -/-/-/dおよび -/-/- -

私はすべてだと思います