【问题标题】:How to do MySQL COUNT depending on some condition如何根据某些条件执行 MySQL COUNT
【发布时间】:2015-03-02 00:50:10
【问题描述】:

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

基本上,流程是这样的:

我从用户那里得到 cpv_id,我在 club_offer_cpv 表中找到它,我得到 club_offer_id,所以我可以连接到 club_offer 表。然后在 club_offer 表中我得到 club_id 以便我可以连接到 club 表。然后在 club 表中我得到 users_id 以便我可以连接到 users 表。然后在 users 表中我得到 company_id 所以我可以连接到最后一个 company_status 表( company_status 有外键 company_id)。 company_status 是我需要从中获取数据的地方。我需要这个:

这里我有 2 个感兴趣的领域:company_statuststamp

company_status 存储每个公司的状态,并且随着时间的推移而变化。在我之前创建数据库的人,每次状态更新时都会插入带有新状态的新行。最新 tstamp 的状态会显示给最终用户。我需要做的是向用户显示状态为“3”的公司的百分比。为此,我需要获取所有公司的所有状态数,以及所有拥有它的状态数“3”。问题是某些公司的状态可能为“3”,但之后它的状态为“2”(它已更改)。因此,我应该以某种方式仅获得 tstamp 最新的状态,因为最新状态将具有最新的时间戳。因此,如果某家公司同时拥有状态“2”和状态“3”,但状态“2”出现在状态“3”之后,我不应该算她。我应该只计算状态为“3”的公司为最新。我的麻烦来了,因为我不知道如何做到这一点。

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

你可以在这里找到 SQL fiddle:http://sqlfiddle.com/#!2/a3e296/4

谁能帮我解决这个问题?谢谢

【问题讨论】:

  • 您的意思是,计算具有最新状态“3”的公司的百分比。

标签: php mysql database count


【解决方案1】:

这里有一个查询可以做你想做的事:

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 如果为真则返回 1,否则返回 0,因此它对条件计数很有用。

这会输出

TOTAL OF STATUS IN 1,2,3    PERCENTAGE OF STATUS 3
28                          92.8571

为你的小提琴。

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

【讨论】:

  • 谢谢。最新是指公司可能具有状态 2 和 3,但只有一个是有效的,一个具有最新时间戳(较新的日期)。所以如果某家公司昨天的状态是3,今天变成了2,那么在计算百分比时不应该计算之前的状态3。字段 tstamp 保存更改的日期和时间。我不知道如何计算。
  • @Anita 编写查询最新状态的日期,即 select max(tstamp) from ... 。然后将其用作子查询来选择 status=3 和 tstamp=(subquery) 的行。
  • 我试过这样,但它不起作用。它不会只选择具有最新时间戳的状态。 select distinct(company_status.company_id), company_status.status, company_status.tstamp 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) AND company_status.tstamp = (SELECT max(tstamp));
猜你喜欢
  • 2020-04-29
  • 2015-07-01
  • 2011-11-01
  • 2021-01-31
  • 1970-01-01
  • 1970-01-01
  • 2019-01-27
  • 2011-10-19
  • 2016-10-11
相关资源
最近更新 更多