2012-02-28 16 views
0

Обзор: Мне нужно написать собственный SQL-запрос в 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" 

Заранее за вашу помощь.

- UPDATE - Я полагаю, что это грубая сила, но она работает почти.

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 ЛЕВОГО соединение. Первые два только сосредоточены на одной категории (2 = опубликовано, 7 = музыка), третий может вернуть несколько значений из подзапроса, чтобы я использовал IN. Подзапрос спросил For entry_id = X (в этом случае 17, который является основным/единственным продуктом, отображаемым), какие категории из group_id = 3 (музыка) я должен предлагать?

Последний вопрос, так как подзапрос возвратил несколько строк, основной выбор может возвращать обманы. Я хочу список уникальных продуктов. Что теперь? Группа по? Сортировать по?

Прошу прощения за этот вопрос, но, честно говоря, Google отстой, когда дело доходит до поиска ответов. Там много примеров дерьма, неотвеченные вопросы и т. Д. Я знаю понятия, но мой синтаксис ржавый. Пожалуйста, помогите брату.

Если кто-нибудь видит какой-либо простой способ оптимизировать вышеизложенное, я буду рад слушать. Еще раз спасибо.

ответ

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. Я отдам это. Моя основная проблема - синтаксис. Я не уверен, как выполнить предварительный выбор запроса. И ...бит выше может быть тем, что мне нужно. Я скоро отправлю отчет. Спасибо. –

+0

Я думаю, что это может сделать это. Но как мне получить подзапрос, чтобы возвращать несколько строк. Вместо ec.group_id =, как я могу сказать, является ли ec.group_id = одним из этих значений в этом подзапросе? Thx снова –

+0

Измените 'ec.group_id = (' to 'ec.group_id IN (' и удалите 'LIMIT 1' в подзапросе ..... см. Обновленный ответ. – Travesty3

0

Вы можете сделать это с носителями тегов EE с помощью related categories mode. Просто создайте новый канал: цикл записей за пределами основного канала продукта: теги записей или вставьте его, если нужно.

+0

Thx. Но если я не слишком быстро переработал, что не будет работать. В основном потому, что он слишком широк. У меня есть несколько групп категорий и когда Я делаю предложения, которые мне нужны, чтобы рассмотреть только два из них. –

+0

Будут ли эти две группы категорий динамическими на основе продукта? Или вы можете их жестко закодировать? –

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} 
+0

Закройте, но проблема в этом - и простите меня за то, что я этого не сказал раньше (мой EE немного ржаветь и минута). Мне нужна категория = '8 | 15' (из одной группы) * и * также категория = '2' (из другой группы). EE, лучше всего может сказать, не может сделать или (|) и (&) в той же категории =. например категория псевдокода = '2 & (8 | 15)'. Я думаю, что застрял в модуле Query. Это похоже на довольно распространенную концепцию. Я удивлен, что так сложно найти ответ на захват. –

+0

Если вы можете сделать эту работу с помощью тегов EE, ваша жизнь станет проще. В противном случае вам нужно написать запрос, который даст вам список идентификаторов записей (достаточно просто), но затем они должны быть переданы в параметр «entry_id» или «fixed_order» другого тега: channel. –

+0

Вы пытались использовать параметры «category» AND «category_group», чтобы сузить результаты вниз так, как вам нужно? –

Смежные вопросы