Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Узнать количество строк в сложном запросе / 23 сообщений из 23, страница 1 из 1
24.06.2015, 20:38:48
    #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
24.06.2015, 21:42:57
    #38992058
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать количество строк в сложном запросе
EgorychMaster,
Код: sql
1.
2.
3.
4.
select count(*) qty
from (
  <очень сложный запрос>
 )z;
...
Рейтинг: 0 / 0
24.06.2015, 22:06:48
    #38992069
EgorychMaster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать количество строк в сложном запросе
Да. Спасибо, Cygapb-007 .
...
Рейтинг: 0 / 0
24.06.2015, 22:11:41
    #38992071
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать количество строк в сложном запросе
Но это решение для общего случая. В частных случаях часто возможно оптимизировать получившийся запрос. Например, в данном случае, вероятно, можно выкинуть все LEFT JOIN-ы.
...
Рейтинг: 0 / 0
24.06.2015, 22:18:48
    #38992074
EgorychMaster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать количество строк в сложном запросе
Да. Спасибо большое, подумаю.
Возможно какая либо связь несущественна.
...
Рейтинг: 0 / 0
25.06.2015, 08:51:13
    #38992232
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать количество строк в сложном запросе
RTFM SQL_CALC_FOUND_ROWS
RTFM FOUND_ROWS()
...
Рейтинг: 0 / 0
25.06.2015, 10:52:10
    #38992364
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать количество строк в сложном запросе
AkinaRTFM SQL_CALC_FOUND_ROWS
RTFM FOUND_ROWS()Этот вариант тоже имеет право на жизнь, но имеет свои подводные камни. Например, может потребовать много времени/ресурсов на больших резалтсетах.
...
Рейтинг: 0 / 0
25.06.2015, 11:42:42
    #38992412
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать количество строк в сложном запросе
miksoftможет потребовать много времени/ресурсов на больших резалтсетах.А COUNT() что, потребует меньше? Всё равно выходной набор не залимитирован и будет получен полностью, количество записей по-любому посчитается - так зачем лишний раз движок гонять?
...
Рейтинг: 0 / 0
25.06.2015, 12:52:12
    #38992503
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать количество строк в сложном запросе
Akinamiksoftможет потребовать много времени/ресурсов на больших резалтсетах.А COUNT() что, потребует меньше? Всё равно выходной набор не залимитирован и будет получен полностью, количество записей по-любому посчитается - так зачем лишний раз движок гонять?Да, COUNT() может потребовать меньше. Для COUNT() нужен только счетчик (помимо исполнения основного тела запроса). А для FOUND_ROWS() еще нужно где-то (думаю, во временной таблице) разместить все записи, имхо.
...
Рейтинг: 0 / 0
25.06.2015, 13:02:38
    #38992522
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать количество строк в сложном запросе
EgorychMaster
На выходе выборка в виде таблицы.
Подскажите как написать к ней count мне надо узнать кол-во строк в этой выборке.


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

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

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

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

Отсюда:

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

Отсюда:

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


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

Во всех остальных случаях выдаваемое функцией значение... ну скажем так - странненькое. Особенно оно забавное в процедуре внутри (и после) цикла, где фетчатся курсоры - хрен угадаешь, чё она даст, даже видя текст процедуры.
...
Рейтинг: 0 / 0
25.06.2015, 15:47:54
    #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
25.06.2015, 15:51:32
    #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
25.06.2015, 15:54:34
    #38992841
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать количество строк в сложном запросе
miksoft , угу... только при выполнении ещё некоторых условий, стыдливо опущенных авторами мануала.
...
Рейтинг: 0 / 0
25.06.2015, 16:05:30
    #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
25.06.2015, 16:51:52
    #38992931
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать количество строк в сложном запросе
miksoftВозможно, что 7 подходит под undefinedУвы, нет - это значение как раз детерминированное. Значение FOUND_ROWS нулится процессом начала выполнения запроса на выборку - а курсор уже открыт, выгребаемые из него записи плюсят текущий счётчик, и похрен, что это "не тот" запрос. И с восьмёркой то же самое - выполнение запроса не начато, потому просто плюс один к текущему счётчику самим фактом отдачи чего-то (сообщение об ошибке - тоже запись).
Совсем веселуха будет, если между селектом и запросом количества записей вставить запрос на добавление или там удаление - сами по себе они счётчик не изменяют, но если сработает триггер, внутри коего имеются выборки ...
...
Рейтинг: 0 / 0
25.06.2015, 17:00:13
    #38992946
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать количество строк в сложном запросе
В общем, я был прав про подводные камни :)
Правда, я как-то и не задумывался, что их может быть так много.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Узнать количество строк в сложном запросе / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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