【问题标题】:SQL query needed for a complex structure复杂结构所需的 SQL 查询
【发布时间】:2022-01-21 03:28:52
【问题描述】:

我需要构建一个棘手的 SQL 查询,以便根据客户会话和地理 IP 数据获得最高优先级规则。

我附上了以下表格:rule、rule_attribute、rule_attribute_value。

rule - 存储所有规则的表 Click here to see a screenshot of the 'rule' table

rule_attribute - 存储所有规则属性的表 Click here to see a screenshot of the 'rule_attribute' table

rule_attribute_value - 存储所有规则属性值的表 Click here to see a screenshot of the 'rule_attribute_value' table

当客户登录时,我可以访问所有这些属性(customer_id、customer_group_id、country_id、subdivision_one_id、subdivision_two_id)。只有 customer_id 和 customer_group_id 将始终具有值。其他是可选的,但它们之间存在依赖关系。如果不首先选择一个国家,我们就不能进行细分。我们可以在不选择国家和第一个细分的情况下进行第二个细分。

我想得到的是以最优化的方式匹配会话数据的最高优先级规则。我有一个涉及一些编码的解决方案,但我想看看是否可以直接通过 SQL。

以下是会话数据数组的一些示例:

Array
(
    [customer_id] => 2
    [customer_group_id] => 1
    [current_store_id] => 0
    [country_id] => 15
    [subdivision_one_id] => 224
    [subdivision_two_id] => 
)

Array
(
    [customer_id] => 2
    [customer_group_id] => 1
    [current_store_id] => 0
    [country_id] => 15
    [subdivision_one_id] => 
    [subdivision_two_id] => 
)

Array
(
    [customer_id] => 3
    [customer_group_id] => 2
    [current_store_id] => 0
    [country_id] => 
    [subdivision_one_id] => 
    [subdivision_two_id] => 
)

【问题讨论】:

  • 请将数据和代码作为文本而不是图像发布
  • @iupaem 请在下面删除您的答案并将详细信息添加到您的问题中。将您的示例数据(当前链接的图像)作为降价表添加到您的问题中,您将更有可能得到回复。

标签: mysql sql join


【解决方案1】:

如果没有更好地理解规则和数据,这是我能想到的最好的方法。它基于您的第一个数组示例 -

SELECT `r`.*
FROM `rule_attribute_value` `rav`
INNER JOIN `rule` `r`
    ON `rav`.`rule_id` = `r`.`rule_id`
INNER JOIN `rule_attribute` `ra`
    ON `rav`.`attribute_id` = `ra`.`attribute_id`
WHERE
    (`rav`.`store_id` = 0 AND `ra`.`attribute_code` = 'customer'        AND `rav`.`value` = 2) OR
    (`rav`.`store_id` = 0 AND `ra`.`attribute_code` = 'customer_group'  AND `rav`.`value` = 1) OR
    (`rav`.`store_id` = 0 AND `ra`.`attribute_code` = 'country'         AND `rav`.`value` = 15) OR
    (`rav`.`store_id` = 0 AND `ra`.`attribute_code` = 'subdivision_one' AND `rav`.`value` = 224)
GROUP BY `r`.`rule_id`
HAVING COUNT(DISTINCT `rav`.`attribute_id`) = 4 /* 4 IS THE NUMBER OF ATTRIBUTES BEING QUERIED */
ORDER BY `r`.`position` ASC
LIMIT 1;

【讨论】:

  • 谢谢你,@nnichols。它正在工作!
猜你喜欢
  • 1970-01-01
  • 2010-10-08
  • 1970-01-01
  • 2019-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多