1

オンラインで見つけたこれと同様のさまざまなソリューションを試しましたが、これまでのところ、必要なものに完全に適合するものはないようです。

次の表を考えると、この質問の目的のために大幅に簡略化されています。

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 はどのように記述されますか?

4

2 に答える 2

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

http://sqlfiddle.com/#!2/ca9f8/10のサンプル データでも利用できます。

tblRetailerFeaturetblFeatureOptions使って参加することを想定しましたfeature_option_id。次に、特定の小売業者 ID のいずれかの行で、関連する各機能 ID が言及されているかどうかを確認します。MySQL はすでに比較を 0/1 値として扱っているため、MAXここではORすべての行に対応しています。

フィドルからわかるように、出力はあなたが求めたものではありませんが、私があなたの入力から期待するものです。したがって、データを結合する方法を指摘するか、自分で調整してください。

于 2013-07-29T09:37:23.053 に答える
1

わかりました、ここにあなたの解決策があります:DEMO

SELECT r.retailer_id,
       IF(rf_1.feature_option_id > 0, 1, 0) AS hasTopListing,
       IF(rf_2.feature_option_id > 0, 1, 0) AS hasGalleryListing,
       IF(rf_3.feature_option_id > 0, 1, 0) AS hasPremiumListing
FROM tblRetailers r
LEFT JOIN tblRetailerFeature rf_1 ON r.retailer_id = rf_1.retailer_id
AND rf_1.feature_option_id IN
  ( SELECT feature_option_id
   FROM tblFeatureOptions
   WHERE feature_id = 1)
LEFT JOIN tblRetailerFeature rf_2 ON r.retailer_id = rf_2.retailer_id
AND rf_2.feature_option_id IN
  ( SELECT feature_option_id
   FROM tblFeatureOptions
   WHERE feature_id = 2)
LEFT JOIN tblRetailerFeature rf_3 ON r.retailer_id = rf_3.retailer_id
AND rf_3.feature_option_id IN
  ( SELECT feature_option_id
   FROM tblFeatureOptions
   WHERE feature_id = 3)

結果:

RETAILER_ID HASTOPLISTING   HASGALLERYLISTING   HASPREMIUMLISTING
1   1   1   0
2   1   1   0
于 2013-07-29T09:35:04.660 に答える