Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 创建具有内部n个引用的视图_Mysql_Sql - Fatal编程技术网

Mysql 创建具有内部n个引用的视图

Mysql 创建具有内部n个引用的视图,mysql,sql,Mysql,Sql,对于CMS系统,我试图用一种优雅的方式在文章关系中搜索用户提供的url 我有两个表:一个表包含文章(cms\u-article),另一个表包含文章的特定语言内容(cms\u-content)。 因此,cms\u文章中的一行在cms\u内容中可以有多个元组,因为它表示文章的不同语言表示 不同的文章也可以通过reference列嵌套,如果是顶级文章,则该列引用cms\u文章中的id列。ref=NULL 各表: cms_article id | ref | published cms_cont

对于CMS系统,我试图用一种优雅的方式在文章关系中搜索用户提供的url

我有两个表:一个表包含文章(
cms\u-article
),另一个表包含文章的特定语言内容(
cms\u-content
)。 因此,
cms\u文章
中的一行在
cms\u内容
中可以有多个元组,因为它表示文章的不同语言表示

不同的文章也可以通过
reference
列嵌套,如果是顶级文章,则该列引用
cms\u文章中的id列。ref
=NULL

各表:

cms_article  id  | ref | published  
cms_content  cid | aid | lang      | url | browserTitle | content | etc etc
从这两个表中,我想创建一个可以用来查找URL的视图。因此,我想为
cms\u文章
中的每个给定元组构造一个totalURL字段,其中每个父/ref都是URL的一部分

例如,让我们回顾一下页面/文章的这种结构:

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\u article
关系中的一个元组。URL字段来自相应的
cms\u content.URL
字段

如何将每个元组的totalURL聚合为一个视图,从而生成如下视图:

cms\u视图

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\u content
中的每个元组,并在PHP中找到引用(并对每个级别和每个元组重复此操作)。但由于这给服务器带来了很大的压力,我正在寻找一个优雅的sql解决方案,比如视图

编辑

这就是我走了多远,我觉得我离得很近。寻找解决方案:将
url
parentURL
组合到一个字段。以及如何在三个层次上做到这一点

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

如果您了解所有语言,则可以连接子查询

例如:

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

我不知道我所有的语言。这只能是一种、两种甚至5种语言……您可以使用CASE检查子查询是否检索数据,然后将其连接起来。这是我能想到的实现您想要的东西的唯一方法,但我认为这会增加您的SQL成本。(我编辑了我的答案,包括案例的答案)嗯,看起来不优雅。。。。我已经用我现在的想法更新了我的问题。