これは、数時間の検索で私を困惑させました。
したがって、キャンペーン テーブルとベンダー テーブルがあります。ベンダーはいくつかのキャンペーンを行っている場合があります。ベンダーに十分なクレジットがある場合は、すべてのキャンペーンを選択したいと考えています。
問題は、同じベンダーからいくつのキャンペーンが選択されるかわからないということです。つまり、ベンダーは 2 つのキャンペーンのクレジットをまだ持っていても、残りのキャンペーンのクレジットを持っていない可能性があります。
例
tblvendors
+---------+------------+---------------+
|vendorId | vendorName | vendorCredits |
+---------+------------+---------------+
| 1 | a | 5 |
| 2 | b | 100 |
+---------+------------+---------------+
tblproducts
+-----------+---------------+------------+
| productId | productName | vendorId |
+-----------+---------------+------------+
| 1 | c | 1 |
| 2 | e | 2 |
| 3 | f | 1 |
| 4 | g | 1 |
| 5 | h | 1 |
+-----------+---------------+------------+
tblcampaigns
+------------+---------------+------------+
| campaignId | productId | vendorId |
+------------+---------------+------------+
| 1 | 1 | 1 |
| 2 | 2 | 2 |
| 3 | 3 | 1 |
| 4 | 4 | 1 |
| 5 | 5 | 1 |
+------------+---------------+------------+
ここで、行が選択されるたびにベンダーが 2 クレジットを失うことを考慮すると、ベンダー 'a' には 5 クレジットしか残っていないため、キャンペーン 1 2 および 3 のみが返されます。
私の現在のクエリはこれです:
SET @maxCampaignId = (SELECT MAX(campaignId) FROM tblCampaigns);
SELECT
@maxCampaignId,
t0.campaignId,
t0.productId,
productName,
productDescription,
productImage,
(CASE WHEN campaignId > (SELECT configValue FROM tblconfiguration WHERE configKey = 'lastHomeCampaignId')
THEN campaignId ELSE campaignId + @maxCampaignId END) AS orderField
FROM tblcampaigns AS t0
INNER JOIN tblproducts AS t1 ON t0.productId = t1.productId
INNER JOIN tblvendors AS t2 ON t1.vendorId = t2.vendorId
WHERE
campaignType = 'homeFeature' AND
t0.isActive = 1 AND
t2.vendorCredits > (SELECT configValue FROM tblconfiguration WHERE configKey = 'campaignHomeFeatureCost' LIMIT 1)
ORDER BY orderField ASC
LIMIT 4
ご覧のとおり、問題は vendorCredits を比較する行にあります。当然のことながら、クエリは、ベンダーが許容できるよりも多くのキャンペーンを選択します。
データベースから直接これを行うことができるはずだと思うので、PHPでこれを行うことを避けたかったのです。