选择 ID 匹配列表之一的位置

eva*_*anr 1 mysql expressionengine e-commerce expresso-store

我只是在学习 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
Run Code Online (Sandbox Code Playgroud)

第二个表包含两个相关字段,mod_id 和 opt_name

表 2:exp_store_product_modifiers

mod_id      opt_name
3           BLACK
4           EU 44
5           BROWN
6           BROWN
Run Code Online (Sandbox Code Playgroud)

我想要实现的是列出所有 DISTINCT opt_name 字段(通过 mod_id 上的连接)对应于我想作为一个整体传入的 entry_ids。

这是到目前为止我想出的代码,我相信除了要求我遍历每个条目 id 的查询之外,它还会做我需要的事情,并且在 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'
Run Code Online (Sandbox Code Playgroud)

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

尸检

以防万一其他人试图在 ExpressionEngine 的 expresso Store 模块中工作并且需要在您的模板中构建一些基本过滤,这里是我最终开始工作的代码。与 Ben 的代码非常相似,但由于解析顺序问题,使用嵌入而不是直接插入 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}
Run Code Online (Sandbox Code Playgroud)

带有 {embed} 看起来像

{embed="embeds/product_filter" entry_ids="{sale_products backspace='1'}{entry_id},{/sale_products}" filter_on="SIZE"}
Run Code Online (Sandbox Code Playgroud)

Ben*_*Lee 6

如果您有条目列表,则可以使用IN. 另外,我会在LEFT JOIN这里使用 a而不是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'
Run Code Online (Sandbox Code Playgroud)