powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка по EAV
5 сообщений из 5, страница 1 из 1
Выборка по EAV
    #39393683
caror
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, уважаемые форумчане. Уже несколько дней мучаюсь над одним запросом. Есть БД интернет магазина, структура такова:

Таблица товаров:
id, model, status
10000, test, 1
10001, test1, 0
10002, test2, 1

Таблица связей каталог - товар 32255 записей, будет как минимум в два раза больше
id, k_id, p_id
1, 37, 10000
2, 37, 10001
3, 38, 10002

Таблица связей товар - характеристики(features) 534730 записей(это примерно треть, будет больше)
id, f_id, p_id, value
1, 100, 10000, Белый
2, 100, 10001, Желтый
3, 100, 10002, Белый

Таблица характеристик
id, title, type
100, Цвет, T
101, Мощность, D

Есть еще конечно таблицы самих каталогов где хранятся наименования и др., но это сейчас не нужно. Так вот, пытаюсь сделать фильтр на сайте, и нужно сделать выборку возможных вариантов характеристик. То есть, есть ID характеристик, например 100, 101, 103, и т.д. и по этим ID нужно вытащить возможные варианты этих характеристик у тех товаров которые находятся в определенном каталоге. На данный момент есть написанный запрос, он выводит характеристики:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT  
	sdvd_features_linking.f_id as id, 
	sdvd_features.title, 
	sdvd_features.`type`, 
    IF(sdvd_features.`type` = 'T', GROUP_CONCAT(DISTINCT sdvd_features_linking.value SEPARATOR '*/*'), CONCAT(MIN(sdvd_features_linking.value*1), '*/*', MAX(sdvd_features_linking.value*1))) as val 
FROM sdvd_features_linking 
JOIN sdvd_features ON(sdvd_features_linking.f_id = sdvd_features.id) 
WHERE sdvd_features_linking.f_id IN(1, 2, 3, 4, 5, 6)
GROUP BY sdvd_features_linking.f_id 



Выполняется он за 0.2925 сек., но тут не учитывается каталог. Если подключить через JOIN таблицу связей каталог - товар, то запрос выполняется несколько минут.

Большая просьба особо не ругать, так как я самоучка и начал недавно.

Подскажите пожалуйста, как можно грамотно написать запрос
...
Рейтинг: 0 / 0
Выборка по EAV
    #39393847
sanjar_osmonov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробуйте добавить LIMIT и загружались в отдельных страницах остальные записи.
...
Рейтинг: 0 / 0
Выборка по EAV
    #39394400
caror
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LIMIT не помог

Делаю тестовый запрос, на вывод хотя бы одного значения характеристики:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT  
    sdvd_features_linking.f_id as id, 
    sdvd_features.title, 
    sdvd_features.`type`, 
    sdvd_features_linking.value 
FROM sdvd_features_linking 
JOIN sdvd_features ON(sdvd_features_linking.f_id = sdvd_features.id) 
JOIN sdvd_katalog_linking ON(sdvd_features_linking.p_id = sdvd_katalog_linking.p_id) 
WHERE sdvd_features_linking.f_id IN(1, 2, 3, 4, 5, 6) AND sdvd_katalog_linking.k_id IN(4,6,7) 
GROUP BY sdvd_features_linking.f_id LIMIT 1


Запрос занимает 40 секунд

Видимо очень долго идет JOIN sdvd_katalog_linking
...
Рейтинг: 0 / 0
Выборка по EAV
    #39394535
paver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
caror,
влом разбираться в запросе, но использование GROUP BY без группирующих функций всегда подозрительно.
...
Рейтинг: 0 / 0
Выборка по EAV
    #39394536
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вероятно, просто нет нужных для ускорения запроса индексов, вот сервер и парится, составляя суммарную выборку, чтобы потом её фильтровать...
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка по EAV
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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