如何从一个MySQL查询生成多个报告?

时间:2014-01-29 19:43:54

标签: php mysql database

我需要报告符合几个条件的记录数。例如,每个州有多少客户。我知道我可以通过一系列MySQL SELECT语句来实现这一点,但这似乎很麻烦,并产生大量(不必要的?)MySQL调用。

你能告诉我一个更好的使用方法吗?我可以使用一个SELECT语句查询数据库,然后使用PHP将结果过滤到变量吗?

2 个答案:

答案 0 :(得分:1)

我建议为此任务创建一个视图,以隐藏查询的复杂性。此外,如果您的表架构发生更改,您可能仍希望从数据库中检索此相同的信息。您可以在一个地方更改视图,而不必更改可能在多个位置的查询以满足您的架构更改。

我只会向您展示查询,因为您无论如何都需要知道如何创建视图。


坚持生活在每个州的客户的例子,让我们假装您还想要统计有多少客户共享相同的姓氏。

我已经在此SqlFiddle设置了数据库可能类似的模拟结构。

具有相同姓氏的客户

以下查询可用于获取具有相同姓氏的客户数量:

SELECT
  LastName AS "Value",
  COUNT(*) AS "Count"
FROM Customers
GROUP BY
  LastName;

同州的客户

同样,可以使用以下查询检索处于相同状态的客户:

SELECT
  S.Name AS "Value",
  COUNT(*) AS "Count"
FROM Customers AS C
  INNER JOIN CustomerAddresses AS CA ON C.Id = CA.CustomerId
  INNER JOIN Addresses AS A ON CA.AddressId = A.Id
  INNER JOIN States AS S ON A.State = S.Id
GROUP BY
  A.State;

获得所需格式

您需要的格式是这两个查询的聚合。您希望两者都作为单个结果集返回。所以,让我们为返回的表格制作一个模式:

  • ResultType - 这将保存与结果类型对应的值。即“国家”
  • - 这将保留聚合列的值。即“佛罗里达”
  • 计数 - 这将保留与汇总列匹配的记录总数。

所以,现在我们有了一个格式,让我们创建一个使用上面两个查询的查询,并将它们放入这种格式。

首先,我为上述每个查询添加了一个新字段: ResultType

例如:

"LastName" AS "ResultType"

现在,我使用UNION ALL语句将我的查询合并到一个查询中:

SELECT * FROM (

  /* LastName query */
  SELECT
    "LastName" AS "ResultType",
    LastName AS "Value",
    COUNT(*) AS "Count"
  FROM Customers
  GROUP BY
    LastName

  UNION ALL

  /* States query */
  SELECT
    "State" AS "ResultType",
    S.Name AS "Value",
    COUNT(*) AS "Count"
  FROM Customers AS C
    INNER JOIN CustomerAddresses AS CA ON C.Id = CA.CustomerId
    INNER JOIN Addresses AS A ON CA.AddressId = A.Id
    INNER JOIN States AS S ON A.State = S.Id
  GROUP BY
    A.State
) AS A

在上面的SqlFiddle中,这会产生如下输出:

RESULTTYPE   VALUE    COUNT
=================================
LastName     Jetson   1
LastName     Johnson  2
LastName     Milton   1
State        Florida  2
State        Georgia  1
State        Utah     1

正如您所看到的,这可能会非常复杂,因此您可能会考虑将其置于视图中。然后,您将能够查询您的视图,就好像它是上面的表(ResultType,Value和Count)。这也可以让你对它进行过滤。

答案 1 :(得分:0)

创建选择查询创建表的外星人数,并使您想要使用的相关列外星人。 以免见示例

选择a.id AS id FROM Table1 AS a 在哪里...... UNION ALL SELECT b.name AS名称 从表2 AS b 在哪里...... ORDER BY(a或b)......