MySQL запрос с 2 SELECT, UNION и LIMIT - как посчитать все элементы? - PullRequest
0 голосов
/ 26 ноября 2011

Я не могу понять, как подсчитать результаты из моего запроса, потому что я limit вывод:

(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

Самое большее, что я получил, - SELECT COUNT(*) ( my query ) as userCount, но тогда я не получаю все остальные поля, которые были выведены моим запросом.

Ответы [ 2 ]

2 голосов
/ 26 ноября 2011
( 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

Информация из документации

1 голос
/ 26 ноября 2011

Это, вероятно, ответит на письмо того, о чем вы, похоже, просите, но не очень разумный способ сформулировать запрос:

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) между двумя таблицами.Возможно, вам придется использовать CROSS JOIN вместо (INNER) JOIN;В качестве альтернативы, вы можете ввести столбец "new" AS type в запрос подсчета и присоединиться к ON n.type = c.type.Затем вам может понадобиться добавить предложение GROUP BY - в большинстве СУБД оно вам понадобится, но 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 во втором запросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...