ВЫБЕРИТЕ, где ID соответствует одному из списка - PullRequest
0 голосов
/ 26 марта 2012

Я только изучаю все тонкости запросов MYSQL, но столкнулся с препятствиями на пути к проекту и был бы признателен за помощь в поиске решения.

У меня есть две таблицы, первая содержит ссылку на запись (entry_id) и связанную модификацию (mod_id), а также категорию модификации, на которую она ссылается (mod_name)

Таблица 1: exp_store_product_options

mod_id      entry_id        mod_name
3           2919            COLOR
4           2311            SIZE
5           2311            COLOR
6           3301            COLOR

вторая таблица содержит два соответствующих поля, mod_id и opt_name

Таблица 2: exp_store_product_modifiers

mod_id      opt_name
3           BLACK
4           EU 44
5           BROWN
6           BROWN

То, чего я пытаюсь добиться, - это перечисление всех полей DISTINCT opt_name, которые (через объединение по mod_id) соответствуют entry_ids, которые я хотел бы передать как единое целое.

вот код, который я придумала до сих пор, я считаю, что он будет делать то, что мне нужно, за исключением того, что мне потребуется циклически выполнять запрос для каждого идентификатора записи, и не будет выполнено требование DISTINCT, так как для каждой итерации, все отлично. (теги {sale_products} взяты из ExpressionEngine и будут повторяться во время анализа, чтобы предоставить мне список результатов entry_id, относящихся к этой странице

SELECT DISTINCT opt_name
FROM exp_store_product_options
INNER JOIN exp_store_product_modifiers
ON exp_store_product_options.product_mod_id=exp_store_product_modifiers.product_mod_id
{sale_products parse='inward'}entry_id = '{entry_id}' OR{/sale_products}
AND mod_name = 'SIZE'

=============================================== =====

POSTMORTEM

На тот случай, если кто-то еще попытается работать в модуле Store Expresso для ExpressionEngine и ему потребуется встроить элементарную фильтрацию в ваши шаблоны, вот код, который я в конечном итоге получил для работы. Очень похоже на код Бена, но использует вставки вместо прямой вставки entry_ids из-за проблем с порядком разбора:

шаблон: embeds / product_filter

{exp:query sql="SELECT DISTINCT opt_name
FROM exp_store_product_modifiers
LEFT JOIN exp_store_product_options
ON exp_store_product_options.product_mod_id = exp_store_product_modifiers.product_mod_id
WHERE exp_store_product_modifiers.entry_id IN ({embed:entry_ids})
AND exp_store_product_modifiers.mod_name = '{embed:filter_on}'"
}

<li><a href="#">{opt_name}</a></li>
{/exp:query}

с {embed}, похожим на

{embed="embeds/product_filter" entry_ids="{sale_products backspace='1'}{entry_id},{/sale_products}" filter_on="SIZE"}

1 Ответ

4 голосов
/ 26 марта 2012

Если у вас есть список записей, вы можете использовать IN.Кроме того, я бы использовал LEFT JOIN здесь вместо INNER JOIN.

SELECT DISTINCT opt_name
FROM exp_store_product_options
LEFT JOIN exp_store_product_modifiers
  ON exp_store_product_options.product_mod_id = exp_store_product_modifiers.product_mod_id
WHERE exp_store_product_options.entry_id IN (1,2,3)
AND mod_name = 'SIZE'
...