Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Использовать условие если оно не вернет пустой результат / 6 сообщений из 6, страница 1 из 1
11.11.2013, 22:30:23
    #38461159
kobec
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использовать условие если оно не вернет пустой результат
Запрос:
SELECT `parameters_values`.* FROM `parameters_values`
LEFT JOIN `products_parameters` ON (`products_parameters`.`parameters_value_id` = `parameters_values`.`id`)
LEFT JOIN `products` ON (`products_parameters`.`product_id` = `products`.`id`)

-------------Дальше идут жойны, нужно их проверять, если с жойном таблица `products` не даст результатов то не использовать даный жойн

LEFT JOIN products_parameters as pr1 ON (`pr1`.`product_id` = `products`.`id`)
LEFT JOIN products_parameters as pr2 ON (`pr2`.`product_id` = `products`.`id`)
LEFT JOIN products_parameters as pr3 ON (`pr3`.`product_id` = `products`.`id`)
WHERE `parameters_values`.`parameter_id` = '15'
AND `products`.`watch` = 1
AND (`pr1`.`parameters_value_id` in (11,10))
AND (`pr2`.`parameters_value_id` in (31,26))
AND (`pr3`.`parameters_value_id` in (15))
GROUP BY `parameters_values`.`id` ORDER BY `parameters_values`.`value` ASC
...
Рейтинг: 0 / 0
12.11.2013, 02:27:09
    #38461274
qwerty112
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использовать условие если оно не вернет пустой результат
kobec -------------Дальше идут жойны, нужно их проверять, если с жойном таблица `products` не даст результатов то не использовать даный жойн

вангую:
Код: sql
1.
2.
3.
4.
5.
6.
LEFT JOIN products_parameters as pr1 ON (`pr1`.`product_id` = `products`.`id`) AND (`pr1`.`parameters_value_id` in (11,10)) 
LEFT JOIN products_parameters as pr2 ON (`pr2`.`product_id` = `products`.`id`) AND (`pr2`.`parameters_value_id` in (31,26)) 
LEFT JOIN products_parameters as pr3 ON (`pr3`.`product_id` = `products`.`id`) AND (`pr3`.`parameters_value_id` in (15)) 
WHERE `parameters_values`.`parameter_id` = '15' 
AND `products`.`watch` = 1 
GROUP BY `parameters_values`.`id` ORDER BY `parameters_values`.`value` ASC



а лучше, ТС, задайте вопрос нормально - пример данных / пример результата на этих данных , если словами не получается ...
тогда, наверняка, можно будет что-то советовать ...

сейчас, даже "не понимая" что вы делаете - видно, что делаете это не правильно:
- вот к чему эти LEFT JOIN products_parameters, если из них ничего не выбирается ??
соотв. и это GROUP BY `parameters_values`.`id` - там нафик не нужен ...
...
Рейтинг: 0 / 0
12.11.2013, 12:59:57
    #38461697
kobec
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использовать условие если оно не вернет пустой результат
Наверно плохо объяснил.
Есть структура фильтры-товары:

Запрос на фильтрацию товаров - выбрано 4 значения 3-х параметров
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT `products`.* FROM `products` 
LEFT JOIN products_parameters as pr1 
ON (`pr1`.`product_id` = `products`.`id`) 
LEFT JOIN products_parameters as pr2 
ON (`pr2`.`product_id` = `products`.`id`) 
LEFT JOIN products_parameters as pr3 
ON (`pr3`.`product_id` = `products`.`id`) 
WHERE `products`.`watch` = 1 
AND `products`.`language_id` = '1' 
AND (`pr1`.`parameters_value_id` in (11,10)) 
AND (`pr2`.`parameters_value_id` in (44)) 
AND (`pr3`.`parameters_value_id` in (15))...

В фильтрах я выводил все параметры и выбирая параметры товары правильно фильтровались, но были случаи когда набор фильтров не находил товаров и пользователь получал сообщение "по вашему запросу ничего не найдено".
Стала задача во время филтрации также отсеять фильтра которые не найдут хотя бы один результат.
Получилось сделать вариант при котором в фильтрах будут выводиться только те, параметры и их значения, которые есть в уже отфильтрованых товарах:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT `parameters_values`.* FROM `parameters_values` 
LEFT JOIN `products_parameters` 
ON (`products_parameters`.`parameters_value_id` = `parameters_values`.`id`) 
LEFT JOIN `products` ON (`products_parameters`.`product_id` = `products`.`id`) 
LEFT JOIN products_parameters as pr1 
ON (`pr1`.`product_id` = `products`.`id`) 
LEFT JOIN products_parameters as pr2 
ON (`pr2`.`product_id` = `products`.`id`) 
LEFT JOIN products_parameters as pr3 
ON (`pr3`.`product_id` = `products`.`id`) 
WHERE `products`.`watch` = 1
AND (`pr1`.`parameters_value_id` in (11,10)) 
AND (`pr2`.`parameters_value_id` in (44)) 
AND (`pr3`.`parameters_value_id` in (15)) 
GROUP BY `parameters_values`.`id` ORDER BY `parameters_values`.`value` ASC (1)

Этот запрос дает нам отфильтрованый набор параметров который неможет привести в дальнейшем к сообщению "по вашему запросу ничего не найдено".
Но отсеялись часть фильтров по выбору которых нашлись бы еще товары.
Например фильтр:

Тип:
-девочка
-мальчик
-новорожденный
Размер:
-1
-2
-3
.....
В последнем случаи отсейки фильтров - при выборе Типа "девочка" останутся фильтра
Тип
-девочка
-мальчик
-новорожденный
Размер
-1
-2
-3
Но мальчик и новорожденный должны остаться потому, что они добавят результатов.
Нужно оптимизировать последний запрос так чтоб он не отсеивал лишнее...
...
Рейтинг: 0 / 0
12.11.2013, 13:09:34
    #38461712
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использовать условие если оно не вернет пустой результат
Первейший вопрос - Вы в курсе, что при написании кода надо использовать не только руки, но и голову?
А если да - то почему Вы везде, абсолютно везде лепите LEFT JOIN? ну может быть, где-то и правда надо - но ведь в данном случае в принципе не надо! Хотя бы потому, что наличие в секции WHERE ограничений по правой таблице вырождает левое связывание во внутреннее...

kobec -------------Дальше идут жойны, нужно их проверять, если с жойном таблица `products` не даст результатов то не использовать даный жойн
Импоссибль.
Представь вариант - с первым JOIN запрос даст несколько записей, со вторым даст несколько записей, с обоими одновременно - пустой набор. Какой JOIN выбрасывать? И, главное, почему, чем ему такая честь? ведь в запросе они совершщенно равноправны.

Если же имеется некий приоритет: добавляем JOIN по одному, если очередной при добавлении приводит к пустому набору - выбрасываем его навсегда и пробуем следующие,- то это решаемо. Но в рамках хранимой процедуры, а не запроса (кстати, возврат сведений о том, что отброшено, тоже задача нетривиальная).
...
Рейтинг: 0 / 0
12.11.2013, 13:35:57
    #38461756
kobec
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использовать условие если оно не вернет пустой результат
Akina, еслиб я был такой умный как Вы то наверно не сидел бы на форуме и не задавал "глупые вопросы" или может это форум только для профессионалов?

По теме:
Каждый жойн отсеивает товары и следующий фильтрует уже отсеяный предыдущим фильтом набор товаров.

AkinaЕсли же имеется некий приоритет: добавляем JOIN по одному, если очередной при добавлении приводит к пустому набору - выбрасываем его навсегда и пробуем следующие,- то это решаемо. Но в рамках хранимой процедуры, а не запроса (кстати, возврат сведений о том, что отброшено, тоже задача нетривиальная).

Я думаю мне нужна помощь с решением именно этой проблемы.

Возможно кто то сталкивался с подобной проблемой и есть другие идеи реализация.
...
Рейтинг: 0 / 0
12.11.2013, 14:05:51
    #38461808
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использовать условие если оно не вернет пустой результат
kobecAkina, еслиб я был такой умный как Вы то наверно не сидел бы на форуме и не задавал "глупые вопросы" или может это форум только для профессионалов?
Нет. Но этор и не песочница в детском саду. Предполагается, что всё сделанное - сделано осознанно. Если ты пишешь LEFT - значит, чётко знаешь, почему не INNER, не RIGHT, И без OUTER. Обязан знать.

kobecЯ думаю мне нужна помощь с решением именно этой проблемы.
Это организационная проблема, а не программная. И создание обоснованного алгоритма должно быть сделано (закончено!) ещё до того, как написан хоть один байт кода. Или получится известное "поди туда не знаю куда..."
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Использовать условие если оно не вернет пустой результат / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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