Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL结果(PHP)中,是否有任何方法可以告诉哪些字段是分组字段_Php_Mysql - Fatal编程技术网

在MySQL结果(PHP)中,是否有任何方法可以告诉哪些字段是分组字段

在MySQL结果(PHP)中,是否有任何方法可以告诉哪些字段是分组字段,php,mysql,Php,Mysql,我有一些PHP代码,可以在MySQL表上运行用户生成的SQL。查询的可能性是有限的,但可以是,例如 SELECT City, Country, count(*) FROM Table ... GROUP BY City, Country 或 或 等等 在显示查询结果时,如果列是一个分组字段(例如COUNT、SUM或AVG等),我希望采取一种类型的操作 除了解析查询外,是否有任何方法可以确定哪些字段是结果集中的分组字段?我使用的是mysqli和PHP,我想这很简单,在select子句中只能选择按

我有一些PHP代码,可以在MySQL表上运行用户生成的SQL。查询的可能性是有限的,但可以是,例如

SELECT City, Country, count(*) FROM Table ... GROUP BY City, Country

等等

在显示查询结果时,如果列是一个分组字段(例如COUNT、SUM或AVG等),我希望采取一种类型的操作


除了解析查询外,是否有任何方法可以确定哪些字段是结果集中的分组字段?我使用的是mysqli和PHP,我想这很简单,在select子句中只能选择按groupby子句分组或按聚合函数分组的字段

所以当你使用

从表中选择城市、国家、计数(*)。。。按城市、国家/地区分组


结果集将有多行,每行有三列:城市、国家、计数(*)。城市和国家是按分组的字段。

通常答案是否。 从数据库接收的是字段名和值。如果不分析原始查询,则无法确定哪些字段是聚合,哪些字段不是聚合

可能在您的情况下,您可以使用一些约束。例如:

  • 如果数字只能生成字段,则可以检查结果的内容。(当然,这是非常不稳定的。)
  • 也许您可以使用字段的名称作为提示。可能它包含一些与聚合相关的内容。(总和、计数、总数……)
但可能是处理问题的最佳/最稳定的方法,以获得对查询生成的更多控制,并设置所需的显式约束或稍后保存所需的详细信息

也许您可以尝试使用此功能:
但我认为这不会令人满意。

未经解析的、用户生成的SQL?多好的主意啊!祝你好运。受限制的命令,不是未解析的,而是作为单独的(有限访问)用户在运行用户SQL之前动态生成的单独数据库上运行。我假设为“未解析”,因为你说的是“除了解析查询…”。即便如此,您也不知道resultset的含义,因此无法知道应该如何处理它(这是您问题的根本问题)。这是个糟糕的设计。不要这样做。曾经。我大体上同意你的观点,但在一些特定的场景中,通常被认为是糟糕的设计实际上是很好的,这就是其中之一——我没有给出所有工作原理的全部细节,因为这与手头的问题无关。对于用户生成的SQL是可以接受的一个特定的、被广泛接受的示例,请查看phpmyadmin…phpmyadmin(和类似的工具)对结果集的含义是不可知的。他们不在乎结果意味着什么。他们不需要知道列是否已聚合。显然,您的应用程序需要更深入地了解它正在处理的数据集的语义,这要求它(至少)解析生成它们的查询-但是如果它要以任何方式处理结果集,然后,为了对它们的语义保持任何确定性,我强烈建议您在发送到数据库之前分解用户的请求并重新组装它。它可以是第一列、第二列或第三列。可能有一个count和sum字段,可以将其重命名(使用AS)。我可以通过解析来完成,我想知道结果集中是否有某种东西表明它是分组字段之一。
SELECT count(*) AS Count, Role, Country FROM Table ... GROUP BY Role, Country
SELECT count(*), TicketType, City, SUM(Quantity) AS 'Total Quantity' FROM Table ... GROUP BY TicketType, City