2012-02-28 64 views
0

概述:我需要在ExpressionEngine中编写自定义SQL问题。自引用SQL语句

我有一个产品表(exp_channel_titles)被分配了类别(exp_category_posts)。在EE类别中进行分组(在exp_categories中定义)。

这里就是我试图做...

基于当我显示特定产品(单列),我要回去了产品表,并拉乱“建议”显示产品的某个类别组中的类别。最后,我想确保从建议中排除显示的产品。

我的SQL没问题,但这在我的书中相当先进。我在这里希望得到一些帮助。

到目前为止,我可以得到单行,它是我感兴趣的类别组的类别。但现在呢?

SELECT * 

    FROM exp_channel_titles 

    LEFT JOIN exp_category_posts 

    ON exp_channel_titles.entry_id = exp_category_posts.entry_id 

    LEFT JOIN exp_categories 

    ON exp_category_posts.cat_id = exp_categories.cat_id 

    WHERE exp_channel_titles.entry_id = "17" AND exp_categories.group_id = "3" 

在此先感谢您的帮助。

- 更新 - 我想这是蛮力,但它的工作,差不多。

SELECT * 

FROM exp_channel_titles my1 

LEFT JOIN exp_category_posts my2 

ON my1.entry_id = my2.entry_id 

LEFT JOIN exp_category_posts my3 

ON my1.entry_id = my3.entry_id 

LEFT JOIN exp_category_posts my4 

ON my1.entry_id = my4.entry_id 

WHERE my3.cat_id = "7" AND my2.cat_id = "2" AND my1.entry_id != "17" AND my4.cat_id IN (

SELECT exp_category_posts.cat_id 

FROM exp_category_posts 

LEFT JOIN exp_categories ON exp_category_posts.cat_id = exp_categories.cat_id 

WHERE exp_category_posts.entry_id = '17' AND exp_categories.group_id = '3' 

由于我需要从3个不同的类别组类别来筛选我做3 LEFT JOIN的。前两个只关注单个类别(2 =发布,7 =音乐),第三个可以从子查询返回多个值,所以我使用IN。 subquest要求entry_id = X(在这种情况下,17,这是显示的主要/单个产品)我应该建议什么类别的group_id = 3(音乐)?

最后一个问题是,由于子查询返回了多行,因此主select可以返回dupes。我想要一个独特的产品清单。现在怎么办?通过...分组?排序?

请原谅这个没有问题的问题,但说实话谷歌糟糕的时候找到答案。有大量的垃圾示例,未解答的问题等。我知道这些概念,但我的语法很生疏。请帮兄弟出去。

如果有人看到任何简单的方法来优化以上,我会很高兴听。再次感谢你。

回答

0

免责声明:不知道这是否会工作,也可能与一些优化非常有可能做到,但也许这将工作:

SELECT DISTINCT ect.* 
FROM 
    exp_channel_titles ect 
    LEFT JOIN exp_category_posts ecp ON ect.entry_id = ecp.entry_id 
    LEFT JOIN exp_categories ec ON ecp.cat_id = ec.cat_id 
WHERE 
    ect.entry_id != '17' 
    AND ec.group_id IN (
     SELECT ec.group_id 
     FROM 
      exp_channel_titles ect 
      LEFT JOIN exp_category_posts ecp ON ect.entry_id = ecp.entry_id 
      LEFT JOIN exp_categories ec ON ecp.cat_id = ec.cat_id 
     WHERE 
      ect.entry_id = '17' 
    ); 
+0

THX。我会放弃这一点。我的主要问题是语法。我不知道如何做预选查询。 AND ...位以上可能是我所需要的。我马上报告。谢谢。 – 2012-02-28 16:13:46

+0

我认为这可能会做到。但是,如何让子查询返回多行。而不是ec.group_id =,我怎么能说如果ec.group_id =是这个子查询中的这些值之一? Thx again – 2012-02-28 16:27:16

+0

更改'ec.group_id =('到'ec.group_id IN('并删除子查询中的'LIMIT 1' .....查看更新的答案。 – Travesty3 2012-02-28 16:29:20

0

您可以使用原生related categories mode EE标签做到这一点。只需创建一个新频道:条目可以在主要产品频道之外循环使用:条目标记,或者在必要时嵌入条目。

+0

Thx。但是,除非我匆匆过快而无法正常工作,主要是因为它太宽泛。我建议我只需要考虑其中的两个 – 2012-02-28 15:34:04

+0

这两个类别组是基于产品动态还是可以硬编码? – 2012-02-28 15:36:37

0

我建议在您的通道中嵌入模板:entries循环,并将当前的entry_id作为嵌入参数传递。

{embed="embeds/related_products" entry_id="{entry_id}"}

然后在您的嵌入式模板:

{exp:channel:entries channel="products" category_group="3|4" entry_id="not {embed:entry_id}" limit="5" orderby="random"} 
    // variables here 
{/exp:channel:entries} 
+0

关闭,但问题是 - 并请原谅我不要提早说(我的EE有点生锈,并通过这一点深入研究分钟) - 我需要category ='8 | 15'(来自一个组)*和* category'='(来自另一个组)。 EE,最好可以告诉不能做或者(&)和(&)在同一类别=。例如伪代码类别='2&(8 | 15)'。我认为我坚持查询模块。这似乎是一个相当普遍的概念。我很惊讶,很难找到一个简单的答案。 – 2012-02-28 16:18:58

+0

如果您可以使用EE标签进行此项工作,您的生活将变得更加简单。否则,你需要写一个查询给你一个条目ID列表(足够简单),但是那些需要通过管道输入另一个通道的entry_id或fixed_order参数:entries标签。 – 2012-02-28 16:26:20

+0

您是否尝试过使用“category”和“category_group”参数来缩小您的搜索结果? – 2012-02-28 16:27:24