したがって、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で行うよりもエレガントではないと感じます。
私は実際にこの問題をクエリの問題としていませんが、問題はデータにあると思います。もしあなたのクエリが '*/*/*/d'を返さなければ、あなたはテーブルに同じ' node.id'を持つ必要なレコードを持っていません。 Sqlは、データベースにあるものを返すように設計されており、データベースには存在しません。 – Shadow
@Shadow - これはWITH ROLLUPの仕組みです。右から要約します。私のアイテムはカテゴリdに存在するので、他のすべてのアイテムには*が含まれます。 これはSQLの問題だという点では正しいですが...ここで質問をどのように言い換えるかはわかりません。 SQLはすべての正しい値を返しています。たとえば、そのノードの場合、 'a/b/c/d'の行を取得し、ROLLUPは' a/b/c/* '、' a/b/*/* '、' a/*/*/* 'と' */*/*/* 'の行があります。 ROLLUPは '*/*/*/d'を実行しません。 – Nick
テーブルに適切なデータがある場合、なぜロールアップが必要なのかわかりません。 – Shadow