php - 选择出现相同值的次数之和小于 X 的行

标签 php mysql

这个问题让我困惑了好几个小时。

所以我有一个事件表和一个供应商表。供应商可能有多个事件。 如果供应商有足够的积分,我想选择所有事件。

问题是我不知道将从同一个供应商那里选择多少事件,这意味着该供应商可能仍然有两个事件的积分,但没有其他事件的积分。

例子

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 byhaving 子句。稍后我会尝试做一些测试

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/

相关文章:

MySQL双重平均和双重分组

PHP 根据字符限制剪切字符串

php - 如何在 MySQL 的左外连接中按顺序显示类别

java - 不同格式的 Axis SOAP 响应是否相同?

php - 另一组眼睛 : Column count doesn't match value count at row 1

mysql - 我的架构中有超过 300 个表,我需要运行截断命令

php - 显示两个不同列的值的查询php mysql

MySQL - 使用来自多个表的更新/设置

php - 为什么我的 INSERT IGNORE 代码不工作?

php - 如何计算日期范围内的记录及其条件