Mysql 确定用户是否具有各种高级功能
我在网上找到了各种类似的解决方案,但到目前为止,似乎没有什么能完全满足我的需要 鉴于以下表格,为了本问题的目的,这些表格大大简化了:Mysql 确定用户是否具有各种高级功能,mysql,sql,Mysql,Sql,我在网上找到了各种类似的解决方案,但到目前为止,似乎没有什么能完全满足我的需要 鉴于以下表格,为了本问题的目的,这些表格大大简化了: tblRetailers retailer_id company_name --------------------------- 1 ABC Ltd 2 DEF Ltd tblRetailerFeature retailer_feature_id retailer_id feature_op
tblRetailers
retailer_id company_name
---------------------------
1 ABC Ltd
2 DEF Ltd
tblRetailerFeature
retailer_feature_id retailer_id feature_option_id
-----------------------------------------------------
1 1 1
2 1 4
3 2 3
4 2 6
tblFeatureOptions
feature_option_id feature_id title Price
------------------------------------------------
1 1 30 Days 14.95
2 1 60 Days 29.90
3 1 90 Days 44.85
4 2 30 Days 19.95
5 2 60 Days 39.90
6 2 90 Days 59.95
tblFeatures
feature_id title
----------------------------
1 Top Listing
2 Gallery Listing
3 Premium Listing
我需要确定,对于每个零售商,他们是否有“顶级”、“画廊”和/或“高级”物品
因此,最终结果应该是这样的:
retailer_id hasTopListing hasGalleryListing hasPremiumListing
--------------------------------------------------------------------
1 0 1 0
2 1 1 0
0/1为布尔值。
如何为此编写SQL?好的,下面是您的解决方案: 结果:
RETAILER_ID HASTOPLISTING HASGALLERYLISTING HASPREMIUMLISTING
1 1 1 0
2 1 1 0
我不知道您的模式是如何工作的,因为我无法解释您所提供的输入所期望的输出 然而,这可能有助于:
SELECT
r.retailer_id,
MAX(fo.feature_id = 1) AS hasTopListing,
MAX(fo.feature_id = 2) AS hasGalleryListing,
MAX(fo.feature_id = 3) AS hasPremiumListing
FROM tblFeatureOptions fo
INNER JOIN tblRetailerFeature rf
ON rf.feature_option_id = fo.feature_option_id
RIGHT JOIN tblRetailers r
ON r.retailer_id = rf.retailer_id
GROUP BY r.retailer_id
也可从您的样本数据中获取,网址为
我假设您使用feature\u option\u id
将tblRetailerFeature
加入到tblFeatureOptions
。然后,我只需检查给定零售商id的任何行是否提到了每个相关的功能id。MySQL已经将比较视为0/1值,因此这里的MAX
对应于所有行上的或
从小提琴上可以看出,输出不是您要求的,而是我期望从您的输入中得到的。所以,要么指出如何加入数据,要么自己调整。以及什么是
顶级
,画廊和高级物品?为什么零售商id
有高级物品?零售商免费列出他们的业务,但可以选择购买高级功能:顶级,Gallery或Premium listings功能\u id
=3是Premium Listing。为什么retailer\u id
=2
有高级列表?为了清晰起见,已经修复了这个问题,尽管该表只是显示我希望查询结果的外观,而不是数据的实际表示形式。
SELECT
r.retailer_id,
MAX(fo.feature_id = 1) AS hasTopListing,
MAX(fo.feature_id = 2) AS hasGalleryListing,
MAX(fo.feature_id = 3) AS hasPremiumListing
FROM tblFeatureOptions fo
INNER JOIN tblRetailerFeature rf
ON rf.feature_option_id = fo.feature_option_id
RIGHT JOIN tblRetailers r
ON r.retailer_id = rf.retailer_id
GROUP BY r.retailer_id