对两个不同表中的 SQL 值组合并使用算术


Combine and use arithmetic on SQL values from two different tables

  1. 我有一个表格,其中包含活动客人的数据。我可以通过以下查询检索参加(membersAttended

    )的人数:
    SELECT COUNT(DISTINCT g.`name1`) AS `membersAttended`
        FROM `tmc_doorapp_guests` g
        LEFT JOIN `tmc_doorapp_events` e
        ON e.`id` = g.`event_id`
        WHERE `name1` REGEXP '^[0-9]+$'
        AND e.`date` > DATE_SUB(NOW(), INTERVAL 30 DAY)
        AND g.`checkin` = 1;
    
  2. 要检索成员总数(totalMembers),我使用:

    SELECT COUNT(DISTINCT `id`) AS `totalMembers`
        FROM `tmc_users`;
    
  3. 为了获得参加过的成员总数的百分比totalPercent),我使用 PHP 进行两个查询,然后按如下方式计算:

    $totalPercent = number_format(($membersAttended/$totalMembers*100),2);
    

我尝试以类似于下面的方式组合这两个查询和百分比计算,但没有运气:

    SELECT COUNT(DISTINCT g.`name1`) AS `membersAttended`,
        COUNT(DISTINCT m.`id`) AS `totalMembers`,
        (`membersAttended` * 100 / `totalMembers`) AS `totalPercent`
        FROM `tmc_doorapp_guests` g, `tmc_users` m
        LEFT JOIN `tmc_doorapp_events` e
        ON e.`id` = g.`event_id`
        WHERE `name1` REGEXP '^[0-9]+$'
        AND e.`date` > DATE_SUB(NOW(), INTERVAL 30 DAY)
        AND g.`checkin` = 1;

我还尝试扩展列:

    SELECT COUNT(DISTINCT g.`name1`) AS `membersAttended`,
        COUNT(DISTINCT m.`id`) AS `totalMembers`,
        (COUNT(DISTINCT g.`name1`) * 100 / COUNT(DISTINCT m.`id`)) AS `totalPercent`
        FROM `tmc_doorapp_guests` g, `tmc_users` m
        LEFT JOIN `tmc_doorapp_events` e
        ON e.`id` = g.`event_id`
        WHERE `name1` REGEXP '^[0-9]+$'
        AND e.`date` > DATE_SUB(NOW(), INTERVAL 30 DAY)
        AND g.`checkin` = 1;

这给了我错误:

错误代码:1054。"on 子句"中的未知列"g.event_id"

如何将这些 SQL/PHP 查询/计算合并到一个 SQL 查询中?

您可以使用子查询:

SELECT COUNT(DISTINCT g.`name1`) AS `membersAttended`,
       (SELECT COUNT(DISTINCT `id`) FROM `tmc_users`) AS `totalMembers`,
       COUNT(DISTINCT g.`name1`) * 100 / (SELECT COUNT(DISTINCT `id`)
                                          FROM `tmc_users`) AS `totalPercent`
FROM `tmc_doorapp_guests` g
LEFT JOIN `tmc_doorapp_events` e
ON e.`id` = g.`event_id`
WHERE `name1` REGEXP '^[0-9]+$'
AND e.`date` > DATE_SUB(NOW(), INTERVAL 30 DAY)
AND g.`checkin` = 1;