我需要报告符合几个条件的记录数。例如,每个州有多少客户。我知道我可以通过一系列MySQL SELECT语句来实现这一点,但这似乎很麻烦,并产生大量(不必要的?)MySQL调用。
你能告诉我一个更好的使用方法吗?我可以使用一个SELECT语句查询数据库,然后使用PHP将结果过滤到变量吗?
答案 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
例如:
"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)......