Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.09.2019, 15:52   #11
Armatus
Форумчанин
 
Регистрация: 09.05.2009
Сообщений: 122
По умолчанию

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


Цитата:
Сообщение от p51x Посмотреть сообщение
Если MySQL то можно заюзать ALL.

Приведите пожалуйста пример, не могу сообразить с документацией.
Armatus вне форума Ответить с цитированием
Старый 27.09.2019, 15:57   #12
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,706
По умолчанию

А что там соображать? В условие добавляете = ALL(подзапрос, где набор нужных ид получаете)
p51x вне форума Ответить с цитированием
Старый 27.09.2019, 16:01   #13
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Armatus Вам надо 198 и 197 и за этого пишите так да ?
Код:
WHERE pa.attribute_id = '198' OR pa.attribute_id = '197'
Если вам надо 197,198,199,200,201,202 ...... то будете столько раз писать запросе OR pa.attribute_id = ? и это нормально ?
или так лучше
Код:
IN (198,197)
xxbesoxx вне форума Ответить с цитированием
Старый 27.09.2019, 16:11   #14
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,706
По умолчанию

Ему нужен "AND".
p51x вне форума Ответить с цитированием
Старый 27.09.2019, 17:01   #15
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

что тут обсуждать, когда вопрос же уже решён?
Как минимум тремя разными способами.
мне лично нравится решение Аватар из пост #9

ps в данном запросе нужен OR и я согласен с xxbesoxx, вместо OR намного лучше использовать IN (List)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.10.2019, 09:48   #16
Armatus
Форумчанин
 
Регистрация: 09.05.2009
Сообщений: 122
По умолчанию

Всем доброго времени суток!

Воспользовавшись советами выше - мне удалось составить работающий запрос:

Код:
SELECT p.product_id, (SELECT category_id FROM oc_product_to_category p2c WHERE p2c.product_id = p.product_id LIMIT 1) AS category_id 
FROM oc_category_path cp 
LEFT JOIN oc_product_to_category p2c ON (cp.category_id = p2c.category_id) 
LEFT JOIN oc_product p ON (p2c.product_id = p.product_id) 
LEFT JOIN oc_product_attribute pa ON (p.product_id = pa.product_id) 
WHERE p.status = '1' AND p.price <= 586070 AND cp.path_id = '1068' 
AND pa.product_id in (select product_id FROM oc_product_attribute where text in ('На потолок')) 
AND pa.product_id in (select product_id FROM oc_product_attribute where text in ('Светодиодная')) 
AND pa.product_id in (select product_id FROM oc_product_attribute where text in ('Для гостиной','Для детской','Для кухни','Для прихожей','Для спальни')) 
AND pa.product_id in (select product_id FROM oc_product_attribute where attribute_id = 198) 
GROUP BY p.product_id 
ORDER BY (p.price) ASC 
LIMIT 0,36
Столкнулся с другой проблемой - с увеличением числа условий в запросе сильно увеличивается время выполнения запроса.

В моем случае во многих таблицах (MYISAM) из запроса более 100 тыс. строк. Например, результат запроса из примера я не дождался.

Посоветуйте методологии оптимизации скорости работы запроса?
Armatus вне форума Ответить с цитированием
Старый 09.10.2019, 10:44   #17
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

добавьте в таблицу oc_product_attribute индексы по полям
product_id
attribute_id
text

но вообще, лучше вынести значения поля text в отдельную таблицу-справочник и в таблице oc_product_attribute сделать на этой справочник ссылку (foreign key).

а ещё непонятно,
зачем это

Цитата:
Сообщение от Armatus Посмотреть сообщение
Код:
AND pa.product_id in (select product_id FROM oc_product_attribute where text in ('На потолок')) 
AND pa.product_id in (select product_id FROM oc_product_attribute where text in ('Светодиодная')) 
AND pa.product_id in (select product_id FROM oc_product_attribute where text in ('Для гостиной','Для детской','Для кухни','Для прихожей','Для спальни')) 
AND pa.product_id in (select product_id FROM oc_product_attribute where attribute_id = 198)
ведь, на мой взгляд, проще и логичнее заменить на одно условие

Код:
AND pa.product_id in (select product_id FROM oc_product_attribute where attribute_id = 198 and text in ('На потолок','Светодиодная','Для гостиной','Для детской','Для кухни','Для прихожей','Для спальни'))
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.10.2019, 10:57   #18
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
SELECT p.product_id, 
 ( SELECT category_id 
   FROM oc_product_to_category p2c 
   WHERE p2c.product_id = p.product_id LIMIT 1 
   ) AS category_id 
FROM oc_category_path cp 
LEFT JOIN oc_product_to_category p2c ON (cp.category_id = p2c.category_id) 
LEFT JOIN oc_product p ON (p2c.product_id = p.product_id) 
LEFT  inner JOIN ( select product_id -- ??? distinct ?
             from oc_product_attribute 
             where attribute_id = 198
               AND pa.product_id in ( select product_id FROM oc_product_attribute where text in ('На потолок') ) 
               AND pa.product_id in ( select product_id FROM oc_product_attribute where text in ('Светодиодная') ) 
               AND pa.product_id in ( select product_id FROM oc_product_attribute where text in ('Для гостиной','Для детской','Для кухни','Для прихожей','Для спальни')) 
               AND pa.product_id in ( select product_id FROM oc_product_attribute where attribute_id = 198 )  -- смотри первое условие данного запроса
             ) as pa ON p.product_id =pa.product_id 
            
WHERE p.status = '1' 
  AND p.price <= 586070 AND cp.path_id = '1068' 
--теперь это стало INNER (т.к. AND ) JOIN
AND pa.product_id in (select product_id FROM oc_product_attribute where text in ('На потолок')) 
AND pa.product_id in (select product_id FROM oc_product_attribute where text in ('Светодиодная')) 
AND pa.product_id in (select product_id FROM oc_product_attribute where text in ('Для гостиной','Для детской','Для кухни','Для прихожей','Для спальни')) 
AND pa.product_id in (select product_id FROM oc_product_attribute where attribute_id = 198) 
 
GROUP BY p.product_id 
ORDER BY (p.price) ASC 
LIMIT 0,36
и подзапрос БЕЗ product_id IN (...)
Код:
select product_id 
from oc_product_attribute n
inner join oc_product_attrubute u ON n.product_id =u.product_id and u.text='На потолок'
inner join oc_product_attribute s on n.product_id =s.product_id and s.text='светодиодная'
inner join oc_product_attribute s on m.product_id =s.product_id and s.text='для ...'
           ( select product_id from oc_product_attribute where text='Для гостиной'
       union select product_id from oc_product_atribute where text='Для детской'
       union select product_id from oc_product_atribute where text='Для кухни'
       union select product_id from oc_product_atribute where text='Для прихожей'
           ) as m on m.product_id =n.product_id
where attribute_id =198
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 09.10.2019 в 11:30. Причина: опечатка m. as n. (см. выделенное жирным)
evg_m вне форума Ответить с цитированием
Старый 09.10.2019, 14:21   #19
Armatus
Форумчанин
 
Регистрация: 09.05.2009
Сообщений: 122
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
добавьте в таблицу oc_product_attribute
а ещё непонятно,
зачем это

ведь, на мой взгляд, проще и логичнее заменить на одно условие

Код:
AND pa.product_id in (select product_id FROM oc_product_attribute where attribute_id = 198 and text in ('На потолок','Светодиодная','Для гостиной','Для детской','Для кухни','Для прихожей','Для спальни'))
В вашем случае:
Код:
.... text = 'На потолок' OR text = 'Светодиодная' OR text = 'Для гостиной' OR text = 'Для детской' OR ...
А мне нужно AND, например:
Код:
... (text = 'На потолок' OR text = 'Светодиодная') AND (text = 'Для гостиной' OR text = 'Для детской') AND ...
Пример выше не совсем правильный, поэтому я использую:
Код:
AND pa.product_id in (select product_id FROM oc_product_attribute where text in ('На потолок')) 
AND pa.product_id in (select product_id FROM oc_product_attribute where text in ('Светодиодная')) 
AND pa.product_id in (select product_id FROM oc_product_attribute where text in ('Для гостиной','Для детской','Для кухни','Для прихожей','Для спальни'))
Мне нужно вывести позиции в которых есть атрибуты 'На потолок' И 'Светодиодная' И ('Для гостиной' ИЛИ 'Для детской' ИЛИ 'Для кухни' ИЛИ 'Для прихожей' ИЛИ 'Для спальни')
Armatus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выборка из базы без уникального поля. Paharok SQL, базы данных 11 27.09.2016 12:42
Сравнение всех значений поля в одной таблице со значением одного поля в другой ZulenkaSun Помощь студентам 3 07.06.2016 15:10
Автоматическое заполнение поля с определеным условием NinaGrnh Microsoft Office Access 0 05.03.2015 13:13
Сумма не уникального поля. Дмитрий mause Помощь студентам 4 25.01.2012 17:08
Вычисляемое поле в таблице ACCESS, создать вычисляемое поля в таблице аксес artlayers Microsoft Office Access 2 04.11.2009 19:29