我有5张彼此相关的表格。我有一个JOIN查询收集所有数据。我首先提供cpv_id作为来自用户的变量。通过介于两者之间的几个表,每个公司都与cpv_id相关。每个公司都有自己的状态,可以是1,2或3.这些状态正在发生变化,我需要获得状态为“3”的公司的百分比(但与提供的cpv_id相关)。
基本上,这就是流程:
我从用户那里得到 cpv_id ,我在 club_offer_cpv 表中找到它,我得到 club_offer_id 所以我可以连接到 club_offer < / strong>表。然后在club_offer表中我得到 club_id ,这样我就可以连接到 club 表了。然后在分会表中,我获得 users_id ,以便我可以连接到用户表。然后在用户表中,我得到 company_id ,这样我就可以连接到最后的 company_status 表( company_status 有外键 company_id 也是。 company_status 是我需要从中获取数据的地方。我需要这个:
这里我有两个感兴趣的领域: company_status 和 tstamp 。
company_status 正在存储每家公司的状态,并且会随着时间的推移而发生变化。在我之前创建数据库的人,每当状态更新新行插入新状态时都会这样做。并向最终用户显示最新 tstamp 的状态。我需要做的是向用户显示状态为“3”的公司的百分比。要做到这一点,我需要获得所有公司的所有状态的数量,以及拥有它的所有人的状态数“3”。问题是某些公司可能具有“3”状态但在此之后它获得状态“2”(它已经改变)。因此,我应该以某种方式获得tstamp最新的状态,因为最新的状态将具有最新的时间戳。因此,如果某个公司的状态为“2”且状态为“3”,但状态“2”在状态“3”之后,我不应该算她。我应该只计算最新状态为“3”的公司。这是我的麻烦,因为我不知道如何做到这一点。
在SQL Fiddle上你会看到我到目前为止所拥有的东西。所以我需要一个可以计算所有最新状态(1,2或3)的查询。然后我需要查询只计算最新的“3”状态,所以我可以说像 70%的公司有状态“3”。 这是目标。 计算状态为“3”的公司的百分比。
你可以在这里找到SQL小提琴:http://sqlfiddle.com/#!2/a3e296/4
任何人都可以帮我解决这个问题吗?谢谢
答案 0 :(得分:2)
这是一个可以做你想要的查询:
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);
请记住,如果其他为0,则MySQL中的sum
将返回1,因此它对条件计数很有用。
这将输出
TOTAL OF STATUS IN 1,2,3 PERCENTAGE OF STATUS 3
28 92.8571
为你的小提琴。
我不确定最新状态的部分是否正确,因为您没有准确了解最新的意思,但最难完成的部分已完成,我很确定您可以完成其余部分如果这不正确。