powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Узнать количество строк в сложном запросе
23 сообщений из 23, страница 1 из 1
Узнать количество строк в сложном запросе
    #38992033
EgorychMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Есть у меня запрос что-то типа этого:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT 
   `ads_order`.*, `map`.*, `sub_items`.*, `map_area_link`.*, `geo_area`.*, `cats`.*, `subway_link`.*, `subway`.* 
FROM `ads_objects` AS `ads` 

LEFT JOIN `ads_objects_cats` AS `ads_order` ON `ads`.`ao_id` = `ads_order`.`aoc_object_id` 
INNER JOIN `map_points` AS `map` ON `ads`.`ao_id` = `map`.`mp_object_id` 
INNER JOIN `ads_map_subitems` AS `sub_items` ON `ads`.`ao_id` = `sub_items`.`amsu_ads_object_id` 
LEFT JOIN `ads_objects_geo_areas` AS `map_area_link` ON `ads`.`ao_id` = `map_area_link`.`aoga_object_id` 
LEFT JOIN `map_geo_areas` AS `geo_area` ON `map_area_link`.`aoga_geo_area_id` = `geo_area`.`mga_id` 
INNER JOIN `ads_cats` AS `cats` ON `ads`.`ao_category_id` = `cats`.`ac_id` 
LEFT JOIN `ads_objects_subway` AS `subway_link` ON `ads`.`ao_id` = `subway_link`.`aos_ads_object_id` 
LEFT JOIN `subway_stations` AS `subway` ON `subway_link`.`aos_station_id` = `subway`.`id` 

WHERE ads.ao_active = 1 AND cats.ac_id IN(31) AND sub_items.amsu_status_admin != 'check' 
GROUP BY `ads`.`ao_id`;



На выходе выборка в виде таблицы.
Подскажите как написать к ней count мне надо узнать кол-во строк в этой выборке.
Спасибо.
...
Рейтинг: 0 / 0
Узнать количество строк в сложном запросе
    #38992058
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EgorychMaster,
Код: sql
1.
2.
3.
4.
select count(*) qty
from (
  <очень сложный запрос>
 )z;
...
Рейтинг: 0 / 0
Узнать количество строк в сложном запросе
    #38992069
EgorychMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да. Спасибо, Cygapb-007 .
...
Рейтинг: 0 / 0
Узнать количество строк в сложном запросе
    #38992071
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но это решение для общего случая. В частных случаях часто возможно оптимизировать получившийся запрос. Например, в данном случае, вероятно, можно выкинуть все LEFT JOIN-ы.
...
Рейтинг: 0 / 0
Узнать количество строк в сложном запросе
    #38992074
EgorychMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да. Спасибо большое, подумаю.
Возможно какая либо связь несущественна.
...
Рейтинг: 0 / 0
Узнать количество строк в сложном запросе
    #38992232
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RTFM SQL_CALC_FOUND_ROWS
RTFM FOUND_ROWS()
...
Рейтинг: 0 / 0
Узнать количество строк в сложном запросе
    #38992364
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaRTFM SQL_CALC_FOUND_ROWS
RTFM FOUND_ROWS()Этот вариант тоже имеет право на жизнь, но имеет свои подводные камни. Например, может потребовать много времени/ресурсов на больших резалтсетах.
...
Рейтинг: 0 / 0
Узнать количество строк в сложном запросе
    #38992412
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftможет потребовать много времени/ресурсов на больших резалтсетах.А COUNT() что, потребует меньше? Всё равно выходной набор не залимитирован и будет получен полностью, количество записей по-любому посчитается - так зачем лишний раз движок гонять?
...
Рейтинг: 0 / 0
Узнать количество строк в сложном запросе
    #38992503
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akinamiksoftможет потребовать много времени/ресурсов на больших резалтсетах.А COUNT() что, потребует меньше? Всё равно выходной набор не залимитирован и будет получен полностью, количество записей по-любому посчитается - так зачем лишний раз движок гонять?Да, COUNT() может потребовать меньше. Для COUNT() нужен только счетчик (помимо исполнения основного тела запроса). А для FOUND_ROWS() еще нужно где-то (думаю, во временной таблице) разместить все записи, имхо.
...
Рейтинг: 0 / 0
Узнать количество строк в сложном запросе
    #38992522
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EgorychMaster
На выходе выборка в виде таблицы.
Подскажите как написать к ней count мне надо узнать кол-во строк в этой выборке.


Это очень неблагодарное занятие. При повторном выполнении самого запроса кол-во строк может измениться,
а запрос с count() будет выполняться почти столько же времени, сколько и основной запрос.

Поэтому всегда лучше просто выполнить весь запрос и просто посчитать его строчки в возвращённом наборе данных.
...
Рейтинг: 0 / 0
Узнать количество строк в сложном запросе
    #38992523
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftAkinaпропущено...
А COUNT() что, потребует меньше? Всё равно выходной набор не залимитирован и будет получен полностью, количество записей по-любому посчитается - так зачем лишний раз движок гонять?Да, COUNT() может потребовать меньше. Для COUNT() нужен только счетчик (помимо исполнения основного тела запроса). А для FOUND_ROWS() еще нужно где-то (думаю, во временной таблице) разместить все записи, имхо.

Несильно там будет меньше. DISTINCT делать всё равно надо.
...
Рейтинг: 0 / 0
Узнать количество строк в сложном запросе
    #38992529
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivmiksoftпропущено...
Да, COUNT() может потребовать меньше. Для COUNT() нужен только счетчик (помимо исполнения основного тела запроса). А для FOUND_ROWS() еще нужно где-то (думаю, во временной таблице) разместить все записи, имхо.

Несильно там будет меньше. DISTINCT делать всё равно надо.А DISTINCT-то откуда взялся?
...
Рейтинг: 0 / 0
Узнать количество строк в сложном запросе
    #38992553
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

Отсюда:

автор
Код: sql
1.
GROUP BY `ads`.`ao_id`;
...
Рейтинг: 0 / 0
Узнать количество строк в сложном запросе
    #38992561
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivmiksoft,

Отсюда:

автор
Код: sql
1.
GROUP BY `ads`.`ao_id`;


А, тут да. Просто была процитирована моя фраза из другого контекста, поэтому я не сразу понял.
...
Рейтинг: 0 / 0
Узнать количество строк в сложном запросе
    #38992671
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftдля FOUND_ROWS() еще нужно где-то (думаю, во временной таблице) разместить все записи, имхо.Я думаю, что сведения, возвращаемые FOUND_ROWS(), хранятся в блоке данных текущего соединения с сервером. Во-первых, они являются динамическим свойством именно соединения, во-вторых, они корректны для открытого соединения даже тогда, когда между предыдущим запросом и запросом с использованием функции прошло много времени и кэш запросов сто раз промылся.
...
Рейтинг: 0 / 0
Узнать количество строк в сложном запросе
    #38992711
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akinamiksoftдля FOUND_ROWS() еще нужно где-то (думаю, во временной таблице) разместить все записи, имхо.Я думаю, что сведения, возвращаемые FOUND_ROWS(), хранятся в блоке данных текущего соединения с сервером. Во-первых, они являются динамическим свойством именно соединения, во-вторых, они корректны для открытого соединения даже тогда, когда между предыдущим запросом и запросом с использованием функции прошло много времени и кэш запросов сто раз промылся.Это когда все записи отфетчены. Но когда все записи отфетчены FOUND_ROWS() имеет мало смысла, т.к. их можно было посчитать самостоятельно.
Мне опасной представляется ситуация, когда записи еще не отфетчены.
...
Рейтинг: 0 / 0
Узнать количество строк в сложном запросе
    #38992831
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftЭто когда все записи отфетчены. Но когда все записи отфетчены FOUND_ROWS() имеет мало смысла, т.к. их можно было посчитать самостоятельно.
Мне опасной представляется ситуация, когда записи еще не отфетчены.
Вообще-то FOUND_ROWS() имеет смысл только в том случае, когда в тексте предыдущего запроса наличествует SQL_CALC_FOUND_ROWS. А тогда похрен, сколько записей вынуто на клиента.

Во всех остальных случаях выдаваемое функцией значение... ну скажем так - странненькое. Особенно оно забавное в процедуре внутри (и после) цикла, где фетчатся курсоры - хрен угадаешь, чё она даст, даже видя текст процедуры.
...
Рейтинг: 0 / 0
Узнать количество строк в сложном запросе
    #38992835
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот попробуй обосновать отмеченные значения:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
mysql> create table test (id int);
Query OK, 0 rows affected (0.37 sec)

mysql> insert into test select 11 union select 22 union select 33;
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> 
mysql> delimiter @@
mysql> create procedure test ()
    -> begin
    -> declare x int;
    -> declare cur cursor for select id from test;
    -> 
    -> open cur;
    -> fetch cur into x;
    -> select x x, found_rows() f;
    -> fetch cur into x;
    -> select x x, found_rows() f;
    -> close cur;
    -> 
    -> open cur;
    -> select 1 x union select 2 union select 3 union select 4;
    -> fetch cur into x;
    -> select x x, found_rows() f;
    -> fetch cur into x;
    -> select x x, found_rows() f;
    -> close cur;
    -> 
    -> end;
    -> @@
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;
mysql> 
mysql> call test;
+------+---+
| x    | f |
+------+---+
|   11 | 3 |
+------+---+
1 row in set (0.03 sec)

+------+---+
| x    | f |
+------+---+
|   22 | 1 |
+------+---+
1 row in set (0.03 sec)

+---+
| x |
+---+
| 1 |
| 2 |
| 3 |
| 4 |
+---+
4 rows in set (0.04 sec)

+------+---+
| x    | f |
+------+---+
|   11 | 4 |
+------+---+
1 row in set (0.04 sec)

+------+---+
| x    | f |
+------+---+
|   22 | 7 |
+------+---+
1 row in set (0.05 sec)

Query OK, 0 rows affected (0.05 sec)

mysql> drop procedure test;
Query OK, 0 rows affected (0.00 sec)

mysql> drop table test;
Query OK, 0 rows affected (0.07 sec)

mysql> select * from test;
ERROR 1146 (42S02): Table 'test.test' doesnt exist
mysql> select found_rows();
+--------------+
| found_rows() |
+--------------+
|            8 |
+--------------+
1 row in set (0.00 sec)


PS. В строке сообщения об ошибке удалил один апостроф - иначе подсветка косячит.
...
Рейтинг: 0 / 0
Узнать количество строк в сложном запросе
    #38992838
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaВообще-то FOUND_ROWS() имеет смысл только в том случае, когда в тексте предыдущего запроса наличествует SQL_CALC_FOUND_ROWS.Не только.
http://dev.mysql.com/doc/refman/5.5/en/information-functions.html#function_found-rows In the absence of the SQL_CALC_FOUND_ROWS option in the most recent successful SELECT statement, FOUND_ROWS() returns the number of rows in the result set returned by that statement.
...
Рейтинг: 0 / 0
Узнать количество строк в сложном запросе
    #38992841
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft , угу... только при выполнении ещё некоторых условий, стыдливо опущенных авторами мануала.
...
Рейтинг: 0 / 0
Узнать количество строк в сложном запросе
    #38992861
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaВот попробуй обосновать отмеченные значения:7 обосновать не могу.

А с 8 все просто:
http://dev.mysql.com/doc/refman/5.5/en/information-functions.html#function_found-rows Beyond the cases described here, the behavior of FOUND_ROWS() is undefined (for example, its value following a SELECT statement that fails with an error).

Возможно, что 7 подходит под undefined, а может и нет.
...
Рейтинг: 0 / 0
Узнать количество строк в сложном запросе
    #38992931
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftВозможно, что 7 подходит под undefinedУвы, нет - это значение как раз детерминированное. Значение FOUND_ROWS нулится процессом начала выполнения запроса на выборку - а курсор уже открыт, выгребаемые из него записи плюсят текущий счётчик, и похрен, что это "не тот" запрос. И с восьмёркой то же самое - выполнение запроса не начато, потому просто плюс один к текущему счётчику самим фактом отдачи чего-то (сообщение об ошибке - тоже запись).
Совсем веселуха будет, если между селектом и запросом количества записей вставить запрос на добавление или там удаление - сами по себе они счётчик не изменяют, но если сработает триггер, внутри коего имеются выборки ...
...
Рейтинг: 0 / 0
Узнать количество строк в сложном запросе
    #38992946
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, я был прав про подводные камни :)
Правда, я как-то и не задумывался, что их может быть так много.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Узнать количество строк в сложном запросе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]