Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 选择出现相同值的次数之和小于X的行_Php_Mysql - Fatal编程技术网

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

Php 选择出现相同值的次数之和小于X的行,php,mysql,Php,Mysql,这个问题让我困惑了好几个小时 所以我有一个活动表和一个供应商表。供应商可能有几个活动。 如果供应商有足够的信用,我想选择所有活动 问题是,我不知道将从同一个供应商中选择多少个活动,这意味着该供应商可能仍有两个活动的信用,但其余活动则没有 范例 tblvendors +---------+------------+---------------+ |vendorId | vendorName | vendorCredits | +---------+------------+----------

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

所以我有一个活动表和一个供应商表。供应商可能有几个活动。 如果供应商有足够的信用,我想选择所有活动

问题是,我不知道将从同一个供应商中选择多少个活动,这意味着该供应商可能仍有两个活动的信用,但其余活动则没有

范例

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中这样做,因为我认为应该可以直接从数据库中完成这项工作。

查看这篇文章,它可能有助于分组方式和使用子句。我稍后会试着做一些测试

更新:

选择t2.vendorId,将tblcampaigns中的vendorCredits作为t0,将tblproducts作为t1加入t0。productId=t1。productId将tblvendors作为t2加入t1。vendorId=t2。按t2.vendorId分组。具有t2.vendorCredits=countt2.vendorId的vendorId

如果我正确理解了这个问题:此查询将选择所有营地多于学分的供应商。

确定找到它

感谢这篇文章:

我所做的是按照子查询的顺序选择所需的行及其相应的行号,以便最终对其重新排序

然后我做了第二个子查询,由vendorId排序,这样我可以计算它出现的次数,并将行数返回到主查询

最后,在主查询中,我将其重新排序回最深子查询中的行号,但现在我有了要比较的值,即每行的信用值*特定供应商的当前行号

不管怎么说,可能代码被清除了,下面是:

SET @creditsCost = (SELECT configValue FROM tblconfiguration WHERE configKey = 'campaignHomeFeatureCost' LIMIT 1);
SET @maxCampaignId = (SELECT MAX(campaignId) FROM tblCampaigns);
SET @curRow = 0;
SELECT * FROM
(
    SELECT *,
        @num := if(@first_column = vendorId, @num:= @num + 1, 1) as row_num,
        @first_column:=vendorId as c
    FROM
        (SELECT
            @curRow := @curRow + 1 AS row_number,
            @maxCampaignId,
            t0.campaignId,
            t0.productId,
            t2.vendorId,
            t2.vendorCredits,
            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
        ORDER BY orderField ASC) AS filteredCampaigns
    ORDER BY vendorId
) AS creditAllowedCampaigns
WHERE
    row_num * @creditsCost <= vendorCredits
ORDER BY row_number

不管怎样,我仍然感谢那些花时间回答问题并试图提供帮助的人,并且我将在以后听取他们的意见,因为我认为这并不是最好的绩效评估方式。

您好,这取决于情况。如果我不能在MySql中完成,那么就必须在PHP中完成。虽然我可以很容易地用PHP实现这一点,但我想知道如何在MySql中实现这一点。嗨,感谢您的回复,但COUNT将对我的结果进行分组,我无法对其进行分组,因为我需要这些结果。如果您指的是where子句中的子查询,您可以使用新select的select in where子句来选择所需的所有内容。我觉得维护该子句将变得非常笨拙。我期待更多与此相关的东西: