我有一個棘手的 SQL 查詢,需要構建它才能根據客戶會話和地理 IP 資料獲得最高優先級的規則。為此,我需要您的意見和經驗來獲得滿足要求的優化版本。
我附上了以下表格:rule、rule_attribute、rule_attribute_value。
rule - 存盤所有規則的表 單擊此處查看“規則”表的螢屏截圖
rule_attribute - 存盤所有規則屬性的表 單擊此處查看“rule_attribute”表的螢屏截圖
rule_attribute_value - 存盤所有規則屬性值的表 單擊此處查看“rule_attribute_value”表的螢屏截圖
當客戶登錄時,我可以訪問所有這些屬性(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] =>
)
期待您的回音。
先感謝您。
uj5u.com熱心網友回復:
現在,這是我將第一個陣列視為有效負載的方法:
Array
(
[customer_id] => 2
[customer_group_id] => 1
[current_store_id] => 0
[country_id] => 15
[subdivision_one_id] => 224
[subdivision_two_id] =>
)
為每個屬性生成一個查詢以驗證是否有匹配規則:SELECT ... WHERE store_id = 0 AND attribute_id = 1 AND value = 1, SELECT ... WHERE store_id = 0 AND attribute_id = 4 AND value = 224。我會有 5 個查詢,每個屬性一個。
在這些查詢之后,我將有一個包含可能匹配規則的陣列。
然后,我將遍歷那些可能的匹配規則并驗證它們是否從下到上匹配(subdivision_two_id、subdivision_one_id、country_id ...)。如果某個規則在某一點不匹配,我就跳過它并繼續下一個規則。
如果沒有可用的規則,就是這樣。如果有多個規則可用,我會考慮最高優先級的規則。
這就是我現在的方法。
uj5u.com熱心網友回復:
如果沒有更好地理解規則和資料,這是我能想到的最好的方法。它基于您的第一個陣列示例 -
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;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/386896.html
