1

CMS システムの場合、記事関連でユーザー提供の URL を検索する洗練された方法を作成しようとしています。

2 つのテーブルがあります。1 つは記事 ( cms_article) を保持し、もう 1 つは記事の言語固有のコンテンツ ( cms_content) を保持します。したがって、記事のさまざまな言語表現を表すため、 1 行にcms_article複数のタプルを含めることができます。cms_content

異なる記事を列でネストすることもできます。これは、最上位の記事の場合、this = NULLreferenceの id 列を参照します。cms_articlecms_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 ソリューションを探しています。

編集

これが私がここまでやってきたことであり、非常に近づいていると感じています。urlparentURLを 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
4

1 に答える 1

0

すべての言語を知っている場合は、サブクエリを連結できます。

例:

SELECT
aid
, CONCATENATE( 
  CASE WHEN (SELECT langcode FROM cms_article x WHERE a.aid = x.aid AND language = 'EN')
  THEN 
    CONCATENATE(
    (SELECT langcode FROM cms_article x WHERE a.aid = x.aid AND language = 'EN')
    , '|')
  ELSE ''
  END,
  CASE WHEN (SELECT langcode FROM cms_article x WHERE a.aid = x.aid AND language = 'DU')
  THEN 
    CONCATENATE(
    (SELECT langcode FROM cms_article x WHERE a.aid = x.aid AND language = 'DU')
    , '|')
  ELSE ''
  END) as language
, CONCATENATE( 
  CASE WHEN (SELECT totalUrl FROM cms_article x WHERE a.aid = x.aid AND language = 'EN')
  THEN 
    CONCATENATE(
    (SELECT totalUrl FROM cms_article x WHERE a.aid = x.aid AND language = 'EN')
    , '|')
  ELSE ''
  END,
  CASE WHEN (SELECT totalUrl FROM cms_article x WHERE a.aid = x.aid AND language = 'DU')
  THEN 
    CONCATENATE(
    (SELECT totalUrl FROM cms_article x WHERE a.aid = x.aid AND language = 'DU')
    , '|')
  ELSE ''
  END) as agregatedUrl
FROM cms_content a
于 2013-06-11T15:59:11.903 に答える