Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.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
具有2个选择、联合和限制的MySQL查询-如何计算所有项目?_Mysql_Sql - Fatal编程技术网

具有2个选择、联合和限制的MySQL查询-如何计算所有项目?

具有2个选择、联合和限制的MySQL查询-如何计算所有项目?,mysql,sql,Mysql,Sql,我无法计算如何计算查询结果,因为我限制了输出: (SELECT "new" as type, name FROM newUsers WHERE name LIKE '%John%') UNION (SELECT "old" as type, name FROM oldUsers WHERE name LIKE '%John%') ORDER BY 1 ASC LIMIT 1, 10 我得到的最远的结果是选择COUNT*我的查询作为userCount,但是我没有得到查询输出的所有其他字段 ( s

我无法计算如何计算查询结果,因为我限制了输出:

(SELECT "new" as type, name FROM newUsers WHERE name LIKE '%John%')
UNION
(SELECT "old" as type, name FROM oldUsers WHERE name LIKE '%John%')
ORDER BY 1 ASC LIMIT 1, 10
我得到的最远的结果是选择COUNT*我的查询作为userCount,但是我没有得到查询输出的所有其他字段

( select SQL_CALC_FOUND_ROWS ...)
union
( select ...) // not using SQL_CALC_FOUND_ROWS here
order by ... limit ...;
从第一个查询中获取结果后, 您可以再次查询

 select found_rows(); // to get all the rows count
信息来自

从第一个查询中获取结果后, 您可以再次查询

 select found_rows(); // to get all the rows count

来自

的信息可能会回答您的要求,但这不是一种非常合理的方式来表述查询:

SELECT c.numusers, n.type, n.name
  FROM (SELECT "new" AS type, name  FROM newUsers WHERE name LIKE '%John%') AS n
  JOIN (SELECT COUNT(*) AS numusers FROM newUsers WHERE name LIKE '%John%') AS c
UNION
SELECT c.numusers, o.type, o.name
  FROM (SELECT "old" AS type, name  FROM oldUsers WHERE name LIKE '%John%') AS o
  JOIN (SELECT COUNT(*) AS numusers FROM oldUsers WHERE name LIKE '%John%') AS c
ORDER BY 1 ASC LIMIT 1, 10
这里唯一奇怪的是,两个表之间没有连接条件,既没有ON子句,也没有USING子句。您可能需要使用交叉连接而不是内部连接;或者,您可以在count查询中引入一个新的列AS-type,并在n.type=c.type上联接。然后您可能需要添加一个GROUPBY子句——在大多数DBMS中您都需要它,但MySQL可能会让您不需要它

但是,我认为您最好使用两个单独的查询—一个查询您问题中的类型和名称,另一个查询:

SELECT COUNT(*) AS numusers, "new" AS type
  FROM newUsers
 WHERE name LIKE '%John%'
 GROUP BY type
UNION
SELECT COUNT(*) AS numusers, "old" AS type
  FROM oldUsers
 WHERE name LIKE '%John%'
 GROUP BY type;

考虑到您使用的是MySQL,在第二个查询中,您可能不需要GROUP BY子句就可以逃脱。

这可能会回答您的要求,但这不是一种非常合理的查询方式:

SELECT c.numusers, n.type, n.name
  FROM (SELECT "new" AS type, name  FROM newUsers WHERE name LIKE '%John%') AS n
  JOIN (SELECT COUNT(*) AS numusers FROM newUsers WHERE name LIKE '%John%') AS c
UNION
SELECT c.numusers, o.type, o.name
  FROM (SELECT "old" AS type, name  FROM oldUsers WHERE name LIKE '%John%') AS o
  JOIN (SELECT COUNT(*) AS numusers FROM oldUsers WHERE name LIKE '%John%') AS c
ORDER BY 1 ASC LIMIT 1, 10
这里唯一奇怪的是,两个表之间没有连接条件,既没有ON子句,也没有USING子句。您可能需要使用交叉连接而不是内部连接;或者,您可以在count查询中引入一个新的列AS-type,并在n.type=c.type上联接。然后您可能需要添加一个GROUPBY子句——在大多数DBMS中您都需要它,但MySQL可能会让您不需要它

但是,我认为您最好使用两个单独的查询—一个查询您问题中的类型和名称,另一个查询:

SELECT COUNT(*) AS numusers, "new" AS type
  FROM newUsers
 WHERE name LIKE '%John%'
 GROUP BY type
UNION
SELECT COUNT(*) AS numusers, "old" AS type
  FROM oldUsers
 WHERE name LIKE '%John%'
 GROUP BY type;

如果您使用的是MySQL,那么在第二个查询中,您可能不需要GROUP BY子句。

您真正想要的是什么?新John行数及其详细信息,加上旧John行数及其详细信息,但总共只需要10行?我认为你把两个不同的问题混合得太彻底了;您可能需要运行两个单独的查询—一个用于获取两个值,即new和old John条目数,另一个用于获取最多10行关于old或new John行的信息。@Jonathan,您猜对了我想要的内容。我之所以尝试计数,是为了显示页面的数量,假设每页有10个项目,那么要显示所有项目就必须通过这些页面。你真正想要的是什么?新John行数及其详细信息,加上旧John行数及其详细信息,但总共只需要10行?我认为你把两个不同的问题混合得太彻底了;您可能需要运行两个单独的查询—一个用于获取两个值,即new和old John条目数,另一个用于获取最多10行关于old或new John行的信息。@Jonathan,您猜对了我想要的内容。我之所以尝试计数,是为了显示页面的数量,假设每页有10个项目,则必须通过这些页面才能显示所有项目。谢谢。我想我是想把事情弄得过于复杂,最好还是用两个问题。根据这种比较分析,这似乎也是一种更快的方法:结合这两个查询是第18章“意大利面查询”中诊断出的问题的一个例子。谢谢。我想我是想把事情弄得过于复杂,最好还是用两个问题。根据这种比较分析,这似乎也是一种更快的方法:结合这两个查询是第18章“意大利面查询”中诊断的问题的一个例子。