这个问题让我困惑了好几个小时。
所以我有一个事件表和一个供应商表。供应商可能有多个事件。 如果供应商有足够的积分,我想选择所有事件。
问题是我不知道将从同一个供应商那里选择多少事件,这意味着该供应商可能仍然有两个事件的积分,但没有其他事件的积分。
例子
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 中执行此操作,因为我认为应该可以直接从数据库中执行此操作。
最佳答案
检查这篇文章,它可能会有所帮助 - group by
和 having
子句。稍后我会尝试做一些测试
Using COUNT(*) in the WHERE clause
更新:
选择 t2.vendorId,vendorCredits from tblcampaigns AS t0 JOIN tblproducts AS t1 ON t0.productId = t1.productId JOIN tblvendors AS t2 ON t1.vendorId = t2.vendorId group by t2.vendorId having t2.vendorCredits =计数(t2.vendorId)
如果我正确理解了这个问题:这个查询将选择所有拥有比积分更多的 campain 的供应商。
关于php - 选择出现相同值的次数之和小于 X 的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13048757/