我需要报告与几个标准中每一个标准匹配的记录的数量。例如,每个州有多少客户。我知道我可以通过一系列MySQL SELECT语句来实现这一点,但是这看起来很麻烦,并且产生了大量的(不必要的?)MySQL电话。
你能告诉我一种更好的方法吗?我可以用一个SELECT语句查询数据库,然后使用PHP将结果过滤为变量吗?
发布于 2014-01-29 13:01:15
我建议为这个任务创建一个视图,以隐藏查询的复杂性。此外,如果表模式发生更改,很可能仍然希望从数据库中检索相同的信息。您可以在一个地方更改视图,而不必在可能的情况下在多个位置更改查询以满足模式更改。
不过,我将向您展示查询,因为您需要知道如何创建视图。
继续以生活在每个州的客户为例,让我们假设您还想知道有多少客户使用相同的姓氏。
我已经设置了一个模拟结构,说明您的数据库在这个SqlFiddle上可能是什么样子。
拥有相同LastName的客户
以下查询可用于获取具有相同姓氏的客户数:
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
例如:
"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)一样。这也可以让你在上面过滤。
发布于 2014-01-30 01:06:37
创建、选择、查询、生成表中的外侨数量,并使您想要使用的相关列外国人。以免参阅示例
选择a.id作为id从Table1中选择为.联合所有选择b.name作为名称从Table2作为b.(a或b)命令.
https://stackoverflow.com/questions/21441007
复制相似问题