Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/236.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.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 如何根据某些条件进行MySQL计数_Php_Mysql_Database_Count - Fatal编程技术网

Php 如何根据某些条件进行MySQL计数

Php 如何根据某些条件进行MySQL计数,php,mysql,database,count,Php,Mysql,Database,Count,我有5张相互关联的桌子。我有一个收集所有数据的连接查询。我首先提供cpv_id作为来自用户的变量。通过中间的几个表,每个公司都与该cpv_id相关。每个公司都有其状态,可以是1、2或3。这些状态正在改变,我需要获得状态为“3”的公司的百分比(但与提供的cpv_id相关) 基本上,这就是流程: 我从用户那里获得cpv\U id,我在俱乐部提供的cpv表中找到它,我获得俱乐部提供的id,这样我就可以连接到俱乐部提供的cpv表。然后在club_offer表中,我获得club_id,以便连接到club表

我有5张相互关联的桌子。我有一个收集所有数据的连接查询。我首先提供cpv_id作为来自用户的变量。通过中间的几个表,每个公司都与该cpv_id相关。每个公司都有其状态,可以是1、2或3。这些状态正在改变,我需要获得状态为“3”的公司的百分比(但与提供的cpv_id相关)

基本上,这就是流程:

我从用户那里获得cpv\U id,我在俱乐部提供的cpv表中找到它,我获得俱乐部提供的id,这样我就可以连接到俱乐部提供的cpv表。然后在club_offer表中,我获得club_id,以便连接到club表。然后在俱乐部表中获取用户id,以便连接到用户表。然后在用户表中,我获得公司id,这样我就可以连接到上一个公司状态表(公司状态也有外键公司id)我需要从公司状态获取数据。我需要这个:

这里我有两个感兴趣的领域:公司状况tstamp

公司_status存储每个公司的状态,并随时间变化。在我之前创建数据库的人,每次状态更新时都是这样,新行插入新状态。并向最终用户显示最新tstamp状态。我需要做的是向用户显示百分之三的公司状态为“3”。要做到这一点,我需要获得所有公司的所有状态编号,以及所有公司的状态编号“3”。问题是,一些公司的状态可能为“3”,但之后它的状态为“2”(它已更改)。因此,我应该以某种方式获得tstamp为最新状态的唯一状态,因为最新状态将具有最新的时间戳。所以,如果某家公司同时拥有状态“2”和状态“3”,但状态“2”在状态“3”之后,我不应该把她算在内。我应该只统计最新状态为“3”的公司。我的麻烦来了,因为我不知道如何处理这种情况

在SQLFiddle上,您将看到到目前为止我所拥有的内容。因此,我需要一个查询来统计所有最新状态(1、2或3)。然后我需要一个只统计最新“3”状态的查询,这样我可以说70%的公司都有“3”状态。这就是目标计算状态为“3”的公司的百分比

您可以在此处找到SQL fiddle:


有人能帮我解决这个问题吗?谢谢你

这里有一个可以满足你要求的查询:

select count(*) as 'Total of status in 1,2,3', (sum(company_status.status = 3) / count(*)) * 100 as 'Percentage of status 3'
from company_status
join users using(company_id)
join club on users.id = club.users_id
join club_offer on club.id = club_offer.club_id
join club_offer_cpv on club_offer.id = club_offer_id
where club_offer_cpv.cpv_id like '66%'
  and company_status.status in(1,2,3);
记住,MySQL中的
sum
如果为true,则返回1,否则返回0,因此它对于条件计数非常有用

这将产生

TOTAL OF STATUS IN 1,2,3    PERCENTAGE OF STATUS 3
28                          92.8571
为了你的小提琴


我不确定“最新状态”的部分是否正确,因为您没有准确说明“最新状态”的含义,但最困难的部分已经完成,如果这不正确,我很肯定您可以完成其余部分。

谢谢。我的意思是,公司可能有状态2和状态3,但只有一个是有效的,一个有最新的时间戳(更新的日期)。因此,如果某个公司昨天的状态为3,但今天已更改为2,则在计算百分比时不应计算以前的状态3。字段tstamp保留更改日期和时间。我不知道该如何计算。@Anita写一个查询,查询最新状态的日期,即从…中选择max(tstamp)。然后用它作为子查询来选择status=3和tstamp=(子查询)的行。它不会仅选择具有最新时间戳的状态<代码>选择不同(公司\状态.公司\ id),公司\状态.状态,公司\状态.t使用(公司\ id)从公司\状态加入用户根据用户加入俱乐部。id=club.users\u id根据俱乐部加入俱乐部报价。id=club\u offer.club\u id根据俱乐部报价加入俱乐部报价。id=club\u offer\u id其中club\u offer\u cpv.cpv\u id如“66%”和company\u status.status in(1,2,3)和company\u status.tstamp=(选择max(tstamp))你的意思是,计算最新状态为“3”的公司的百分比。