Самореферентный оператор SQL - PullRequest
0 голосов
/ 28 февраля 2012

Обзор: мне нужно написать собственный вопрос SQL в ExpressionEngine.

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

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

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

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

Ответы [ 3 ]

0 голосов
/ 28 февраля 2012

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

0 голосов
/ 28 февраля 2012

Я бы предложил встроить шаблон в ваш канал: цикл записи и передать текущий 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 голосов
/ 28 февраля 2012

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Не уверен, что это сработает, и вполне вероятно, что это с некоторой оптимизацией, но, возможно, это сработает:

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'
    );
...