2012-02-28 65 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