复杂的查询(对我来说无论如何)

时间:2016-05-02 07:13:51

标签: mysql

我已经在这里待了几天而且接近但没有雪茄。

网站用户从下拉框中选择一个类别。我们需要检查是否存在与该类别或该类别的祖先中的任何类别相关联的费用表,如果是,则该用户是否具有足够的学分以在该类别下发布潜在客户。如果没有收费表,或者用户有足够的积分,用户可以继续列出他们的项目。

以下是相关表格,其中包含一些示例数据以证明关系

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”,则用户没有该类别的有效订阅。

我的思绪因此而被堵塞,我甚至不知道我是否已经解释得很好。抱歉。请问我需要澄清的任何事情。不幸的是,我几乎坚持使用桌子。

0 个答案:

没有答案