概述:我需要在ExpressionEngine中编写自定义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。子请求for entry_id = X(在这种情况下是17,这是显示的主/单个产品)我应该建议group_id = 3(音乐)中的哪些类别?
最后一个问题是,由于子查询返回了多行,因此主选择可以返回dupes。我想要一份独特的产品清单。现在怎么办?通过...分组?订购?
请原谅这个引人注目的问题,但说实话,谷歌在寻找答案方面很糟糕。有大量的垃圾示例,未解答的问题等等。我知道这些概念,但我的语法生锈了。请帮助一个兄弟。
如果有人看到任何简单的方法来优化上述内容,我会很高兴听。再次感谢你。
答案 0 :(得分: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'
);
答案 1 :(得分:0)
您可以使用related categories mode使用原生EE代码执行此操作。只需创建一个新频道:条目在主要产品频道之外循环:条目标记,或者如果必须,则嵌入它。
答案 2 :(得分:0)
我建议在您的频道中嵌入模板:条目循环,并将当前的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}