SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 19.09.2017 20:22:19

SergTN
Участник
Зарегистрирован: 19.09.2017
Сообщений: 5

Как получить количество найденных строк выборки при LEFT JOIN 1-ко- многим?

Помогите пожалуйста с такой выборкой.
Связываю таблицу А (список товаров) отношением 1-ко-многим к дочерней таблице Б (параметры товаров) через LEFT JOIN и естественно получаю в итоговой выборке все записи связанные с таблицей А. Ограничение LIMIT M, N применяется к итоговой выборке с учетом таблицы Б и общее количество найденных строк тоже с учетом таблице В. В итоге плывет постраничный вывод и некорректное количество найденных строк. Как сделать чтобы ограничение LIMIT M, N применялось бы только к родительской таблице А и запрос на общее число найденных строк SELECT FOUND_ROWS() учитывал бы только исходную таблицу А.
Ничего кроме как сделать так:

select * from (select SQL_CALC_FOUND_ROWS * from table A  where  clause_A  LIMIT M, N) as AA
left join table B
on AA.id = B.id  WHERE clause_B

не нашел.
В какой из селектов ставить SQL_CALC_FOUND_ROWS, чтобы получить общее число без Лимит?
Есть еще момент: в условиях поиска есть столбцы как из табл А, так и из табл. В. Нужно-ли в условии WHERE clause_B дублировать условия полей clause_A (думаю что нет)

Есть еще какие-нибудь способы решения проблемы?
PS на самом деле к табл. А подключено три таблицы 1-to-many. (поэтому Лимит вообще обрезает не то что нужно и с постраничным выводом полный ужос) )
Спасибо за помощь

Неактивен

 

#2 19.09.2017 22:00:08

SergTN
Участник
Зарегистрирован: 19.09.2017
Сообщений: 5

Re: Как получить количество найденных строк выборки при LEFT JOIN 1-ко- многим?

Хотя на самом деле, попробовал - не подходит этот вариант, не  верно подсчитывается общее количество без учета LIMIT ( т.к. SQL_CALC_FOUND_ROWS нельзя расположить во внутреннем select)
вообщем засада...

Неактивен

 

#3 20.09.2017 07:19:34

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Как получить количество найденных строк выборки при LEFT JOIN 1-ко- многим?

отдельный запрос
select count(*) from table A  where  clause_A  LIMIT M, N

про SQL_CALC_FOUND_ROWS см http://sqlinfo.ru/forum/viewtopic.php?id=6876

Неактивен

 

#4 20.09.2017 13:41:37

SergTN
Участник
Зарегистрирован: 19.09.2017
Сообщений: 5

Re: Как получить количество найденных строк выборки при LEFT JOIN 1-ко- многим?

vasya написал:

отдельный запрос
select count(*) from table A  where  clause_A  LIMIT M, N

про SQL_CALC_FOUND_ROWS см http://sqlinfo.ru/forum/viewtopic.php?id=6876

проблема в том, что часть столбцов в условии отбора находятся как-раз в присоединяемых таблицах. А без них количество найденного будет иным , чем с ними

Неактивен

 

#5 20.09.2017 22:17:26

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Как получить количество найденных строк выборки при LEFT JOIN 1-ко- многим?

покажите на примере, что вы хотите посчитать

Неактивен

 

#6 20.09.2017 23:26:06

SergTN
Участник
Зарегистрирован: 19.09.2017
Сообщений: 5

Re: Как получить количество найденных строк выборки при LEFT JOIN 1-ко- многим?

В таблице parent_table список товаров. В таблицах  child_param_table_1 и child_param_table_2 списки параметров товара (их может быть и несколько у одного товара)

select  SQL_CALC_FOUND_ROWS * from table `parent_table`
left join `child_param_table_1` on `parent_table`.`id`=`child_param_table_1`.`id` /* 1-to-many*/
left join `child_param_table_2` on `parent_table`.`id`=`child_param_table_2`.`id`  /* 1-to-many*/
where `parent_table`.`param_1`='NNN'  and `parent_table`.`param_2`='MMM' and `child_param_table_1`.`field_param` = 'XXX' and  `child_param_table_2`.`field_param` = 'YYY'  limit $start_pos, $end_pos

Соответственно хочу посчитать сколько найдено ВСЕГО товаров из таблицы parent_table, удовлетворяющих всем условиям запроса, без учета LIMIT и сделать постраничный вывод итогов.  Если бы таблицы связывались как 1-to-1, то никаких проблем. А т.к. параметров у товара несколько , то и в выборке я получаю "дублирование" строк из таблицы parent_table на количество соответствующих ей строк из дочерних таблиц. (Т.е. если соответствует 5 параметров по id то и в выборке будет считаться что найдено не 1 строка (товар-то 1) ,а 5 строк. И так для всех товаров. И если реально найдено допустим 7 товаров с такими параметрами запроса, то SELECT FOUND_ROWS() будет содержать не 7 а например 20 . Если у этих 7-и товаров по одному параметру, то тогда все ОК. Но я ведь заранее не знаю этого

Неактивен

 

#7 21.09.2017 09:57:39

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Как получить количество найденных строк выборки при LEFT JOIN 1-ко- многим?

select  count(*) as `кол-во найденных товаров` from table `parent_table`
left join `child_param_table_1` on `parent_table`.`id`=`child_param_table_1`.`id` /* 1-to-many*/
left join `child_param_table_2` on `parent_table`.`id`=`child_param_table_2`.`id`  /* 1-to-many*/
where `parent_table`.`param_1`='NNN'  and `parent_table`.`param_2`='MMM' and `child_param_table_1`.`field_param` = 'XXX' and  `child_param_table_2`.`field_param` = 'YYY'
group by `parent_table`.`id`;

Неактивен

 

#8 21.09.2017 20:01:45

SergTN
Участник
Зарегистрирован: 19.09.2017
Сообщений: 5

Re: Как получить количество найденных строк выборки при LEFT JOIN 1-ко- многим?

т.е делать отдельный запрос только для количества и одним запросом никак не обойтись?  Не очень оптимально с точки зрения скорости
Может у меня не правильная схема данных и это как-то по другому делают?

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson