CMS システムの場合、記事関連でユーザー提供の URL を検索する洗練された方法を作成しようとしています。
2 つのテーブルがあります。1 つは記事 ( cms_article
) を保持し、もう 1 つは記事の言語固有のコンテンツ ( cms_content
) を保持します。したがって、記事のさまざまな言語表現を表すため、 1 行にcms_article
複数のタプルを含めることができます。cms_content
異なる記事を列でネストすることもできます。これは、最上位の記事の場合、this = NULLreference
の id 列を参照します。cms_article
cms_article.ref
テーブル:
cms_article id | ref | published
cms_content cid | aid | lang | url | browserTitle | content | etc etc
これら 2 つのテーブルから、URL を検索するために使用できるビューを作成したいと思います。cms_article
したがって、URL の一部としてすべての親/参照を使用して、特定のタプルごとに totalURL フィールドを構築したいと考えています。
たとえば、このページ/記事の構造を確認してみましょう。
AID English Dutch More languages
1 /Products /Producten
4 /Products/Product-2 /Producten/Product-2
7 /Products/Product-2/screenshots /Producten/Product-2/afbeeldingen
34 /Products/Product-2/pricing /Producten/Product-2/prijzen
12 /Products/Product-5 /Producten/Product-5
6 /About-us /Over-ons
各行は、cms_article
リレーション内の記事と 1 つのタプルを表します。URL フィールドは、対応するcms_content.url
フィールドから取得されます。
各タプルの totalURL をビューとして集約して、次のようなビューを生成するにはどうすればよいですか。
cms_view :
aid = article ID = integer
lang = language = NL|EN|...
totalURL = agregated URL = /products/product-2/pricing
上記の例では、次のテーブルを生成する必要があります。
1 | EN | /Products
1 | NL | /Producten
4 | EN | /Products/Product-2
4 | NL | /Producten/Product-2/afbeeldingen
etc etc
もちろんcms_content
、PHP ですべてのタプルをトラバースして参照を見つけることができます (すべてのレベルとすべてのタプルに対してこれを繰り返します)。しかし、これはサーバーに大きな負荷をかけるため、ビューのようなエレガントな SQL ソリューションを探しています。
編集
これが私がここまでやってきたことであり、非常に近づいていると感じています。url
とparentURL
を 1 つのフィールドに結合するためのソリューションを探しています。そして、これを 3 レベルの深さで行う方法。
SELECT
a.id AS aid, c.lang, a.ref,
c.url,
(
SELECT c2.url
FROM cms_content AS c2
WHERE c2.aid = a.ref
AND
c2.lang = c.lang
) AS parentURL
FROM cms_content AS c
LEFT JOIN cms_article AS a ON c.aid = a.id
WHERE a.domain = 'some.url'
AND a.published =1
ORDER BY aid