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子句来选择所需的所有内容。我觉得维护该子句将变得非常笨拙。我期待更多与此相关的东西: