SELECT其中ID与列表中的一个匹配

时间:2012-03-26 01:45:10

标签: mysql e-commerce expressionengine 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

第二个表包含两个相关字段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。

这是我到目前为止提出的代码,我相信除了要求我遍历每个条目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'

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

死后

以防万一其他人试图在expresso的ExpressionEngine商店模块中工作,并且需要在模板中构建一些基本的过滤,这里是我最终开始工作的代码。与Ben的代码非常相似,但由于解析顺序的问题,使用嵌入而不是直接插入entry_id:

模板: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 个答案:

答案 0 :(得分:4)

如果您有条目列表,则可以使用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'