我已经尝试过各种类似的解决方案,这些都是我在网上找到的,但到目前为止似乎没有什么能完全满足我的需要。
鉴于下表,为了这个问题的目的大大简化了:
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
我需要为每个零售商确定他们是否有“Top”、“Gallery”和/或“Premium”列表
所以,最终结果应该是这样的:
retailer_id hasTopListing hasGalleryListing hasPremiumListing
--------------------------------------------------------------------
1 0 1 0
2 1 1 0
0/1 是 bool 值。 如何为此编写 SQL?
最佳答案
我不明白你的模式是如何工作的,因为我无法解释你所提供的输入所期望的输出。
尽管如此,这可能会有所帮助:
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
也可在 http://sqlfiddle.com/#!2/ca9f8/10 获取您的样本数据
我假设您使用 feature_option_id
将 tblRetailerFeature
加入到 tblFeatureOptions
。然后我简单地检查给定零售商 ID 的任何行是否提到了每个相关的功能 ID。 MySQL 已经将比较视为 0/1 值,因此此处的 MAX
对应于所有行的 OR
。
正如您从 fiddle 中可以看出的,输出不是您要求的,但这是我期望从您的输入中得到的。因此,要么指出如何连接您的数据,要么自行调整。
关于mysql - 确定用户是否具有各种高级功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17919852/