我已经在这里待了几天而且接近但没有雪茄。
网站用户从下拉框中选择一个类别。我们需要检查是否存在与该类别或该类别的祖先中的任何类别相关联的费用表,如果是,则该用户是否具有足够的学分以在该类别下发布潜在客户。如果没有收费表,或者用户有足够的积分,用户可以继续列出他们的项目。
以下是相关表格,其中包含一些示例数据以证明关系
all_categories
record_id level title parent_category_id parent_id
-----------------------------------------------------------------------
24 0 Real Estate null null
5915 1 Residential 24 24
7569 2 For sale 5915 24
10087 3 Apartment 7569 24
5691 1 Cars 7 7
premium_features (已付费订阅)
record_id title
--------------------------
1 Auction Packages
3 Real Estate
4 Vehicles
cat_feature (为上述订阅指定的类别,如果适用,即如果您 想要列出属于这些类别的产品,您需要一个 订阅。但是,如果您购买了拍卖套餐并且正在拍卖 您的产品然后您不需要根据特定订阅 类别)
category_id feature_id
--------------------------
24 3
5691 4
feature_options (订阅时可以选择的具体选项。“数量”是数字 您收到的特定选项的实例)
record_id feature_id title type price qty
-----------------------------------------------------------------------------
1 1 37 Auctions auction 19.95 37
18 2 E-Store all 49.95 1
19 3 Private auction 99.00 1
20 3 Corporate auction 25.00 1
21 4 Private all 39.00 1
user_feature “剩余”是用户的余额
record_id user_id feature_option_id remaining
-------------------------------------------------------
1 2 1 36
2 2 21 0
39 2 19 1
假设将以下参数传递给运行查询的函数(并不一定需要所有参数,例如“level”):
user_id = 2
category_id = 10087
level = 3
type = auction
我迄今为止的凌乱代码反映了我现阶段处于凌乱的心态,如下:
SELECT T2.record_id as ac_catid, fo.type ,fo.record_id as fo_record_id,
fo.feature_id as fo_feature_id, fo.title as fo_title, pf.title as pf_title,
cf.feature_id as cf_feature_id, uf.user_id, uf.remaining
FROM (SELECT @r AS _id ,
( SELECT @r := parent_id FROM all_categories WHERE record_id = @r )
AS parent_id , @l := @l + 1 AS lvl
FROM (SELECT @r := record_id , @l := 0 FROM all_categories WHERE record_id = 10087) vars
, all_categories m WHERE @r <> 0) T1
RIGHT JOIN all_categories T2 ON T1._id = T2.record_id
LEFT OUTER JOIN cat_feature cf on cf.cat_id = T2.record_id
LEFT OUTER JOIN premium_features pf on pf.record_id = cf.feature_id
RIGHT JOIN feature_option fo on fo.feature_id = cf.feature_id
LEFT OUTER JOIN user_feature uf on uf.feature_option_id = fo.record_id
WHERE 1=1
AND uf.user_id = 2
ORDER BY ac_catid;
如果上面的表格已完全填充,这会给我以下输出:
ac_catid type fo_record_id fo_feature_id pf_title fo_title cf_feature_id user_id remaining
--------------------------------------------------------------------------------------------------------------
null auction 1 1 null 37 Auctions null 2 36
24 all 19 3 Real Estate Private 3 2 1
5691 all 21 4 Vehicles Private 4 2 0
问题是查询只返回用户注册的内容。因此它返回“24”记录只是因为用户已经专门注册了这个(根据user_feature表,即他注册了feature_option 19,它通过cat_feature表与premium_feature 3相关)。但是,我希望它能识别“24”记录,因为它是他们选择的category_id的祖先,即10087.我只是不知道如何进一步采取这一点。
注意:如果“拍卖”作为“sale_type”参数传递,则feature_option表的“类型”列必须为“拍卖”。如果此值为“all”,则用户没有该类别的有效订阅。
我的思绪因此而被堵塞,我甚至不知道我是否已经解释得很好。抱歉。请问我需要澄清的任何事情。不幸的是,我几乎坚持使用桌子。