Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: выборка по сериям и куча ещё...

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Sig
Отправлено: 26 Февраля, 2016 - 13:57:00
Post Id


Новичок


Покинул форум
Сообщений всего: 48
Дата рег-ции: Янв. 2012  


Помог: 0 раз(а)




задача
1. выбрали товар люстра (variantID = 43) и характеристику его 12 лампочек (variantID = 136)
2. определяем серии (seria_productID) где есть такой товар
3. проверяем есть ли в этой серии ещё бра и торшер (variantID in (3,41)), групируем по сериям, и делаем первые 20 серий (постраничная навигация)
4. добавляем к этим сериям все товары, и делаем сортировку где в начале выводим люстры (variantID = 43)
---
запрос получился очень тормозной................
кто-то знает как оптимизировать ?
----------
Сам зациклился, может кто-то пнёт в каком направлении идти ?
-----------


есть 2 таблицы

filtr_table - таблица
CODE (htmlphp):
скопировать код в буфер обмена
  1. productID       Price   skidka  optionID        variantID       seria_productID option_value
  2. 18883   11950   0       11      0       1782    300
  3. 18883   11950   0       20      0       1782    600
  4. 18883   11950   0       57      0       1782    9
  5. 18883   11950   0       62      1       1782    0
  6. 18883   11950   0       63      2       1782    0
  7. 18883   11950   0       64      43      1782    0
  8. 18883   11950   0       65      44      1782    0
  9. 18883   11950   0       66      136     1782    0
  10. 18883   11950   0       67      5       1782    0
  11. 18883   11950   0       67      6       1782    0
  12. 18883   11950   0       67      7       1782    0
  13. 18883   11950   0       68      19      1782    0
  14. 18883   11950   0       69      45      1782    0
  15. 18883   11950   0       70      46      1782    0
  16. 18883   11950   0       100     935     1782    0



shop_products - таблица
CODE (htmlphp):
скопировать код в буфер обмена
  1. productID       categoryID      name
  2. 18880   439     Люстра на штанге Versailles A9500PL-5CC
  3. 18881   439     Люстра на штанге Versailles A8542LM-6GO
  4. 18882   439     Люстра на штанге Jersey A8543PL-5GO
  5. 18883   439     Люстра на штанге Cloud A8170PL-9AB


индексы


CODE (SQL):
скопировать код в буфер обмена
  1. PRIMARY BTREE
  2. productID
  3. optionID
  4. variantID
  5.  
  6. ihc1    BTREE  
  7. variantID
  8. productID
  9.  
  10. ihc3    BTREE
  11. optionID
  12. seria_productID
  13. variantID








1. определяем серии, товара какой ищем

CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT DISTINCT seria_productID
  3.     FROM filtr_table
  4.         WHERE variantID IN (136,43)
  5.             AND seria_productID!=0
  6.         GROUP BY productID
  7.         HAVING count(productID)>=2
  8.  

результат explain
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE filtr_table range ihc1 ihc1 4 \N 22587 Using where; Using temporary; Using filesort


2. добавляем, - определяем, есть ли в этой серии ещё товары с variantID in (3,41), групируем по сериям, показывать первые 20 серий

CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT b.seria_productID
  3.     FROM(
  4.         SELECT DISTINCT seria_productID
  5.             FROM filtr_table
  6.                 WHERE variantID IN (136,43)
  7.                     AND seria_productID!=0
  8.                 GROUP BY productID
  9.                 HAVING count(productID)>=2
  10.     ) AS a
  11.     LEFT JOIN filtr_table AS b
  12.         ON (a.seria_productID=b.seria_productID)
  13.         WHERE b.variantID IN (3,41)
  14.             GROUP BY b.seria_productID
  15.             HAVING count(DISTINCT b.variantID)>=2
  16.             ORDER BY b.seria_productID ASC
  17.             LIMIT 20
  18.  

результат explain
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY b range ihc1 ihc1 4 \N 2808 Using where
1 PRIMARY <derived2> ALL \N \N \N \N 531 Using where
2 DERIVED filtr_table range ihc1 ihc1 4 \N 22587 Using where


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

CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT DISTINCT d.*
  3.     FROM
  4.         (SELECT b.seria_productID
  5.             FROM(
  6.                 SELECT DISTINCT seria_productID
  7.                     FROM filtr_table
  8.                         WHERE variantID IN (136,43)
  9.                             AND seria_productID!=0
  10.                         GROUP BY productID
  11.                         HAVING count(productID)>=2
  12.         ) AS a
  13.         LEFT JOIN filtr_table AS b
  14.         ON (a.seria_productID=b.seria_productID)
  15.             WHERE b.variantID IN (3,41)
  16.                 GROUP BY b.seria_productID
  17.                 HAVING count(DISTINCT b.variantID)>=2
  18.                 ORDER BY b.seria_productID ASC
  19.                 LIMIT 20
  20.         ) AS a2
  21.         LEFT JOIN filtr_table AS b2
  22.         ON (a2.seria_productID=b2.seria_productID)
  23.         LEFT JOIN shop_products AS d
  24.         ON (b2.productID=d.productID)
  25.                 ORDER BY b2.seria_productID ASC, FIELD (b2.variantID, 43,3,41) DESC
  26.  


результат explain
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY <derived2> ALL \N \N \N \N 20 Using temporary
1 PRIMARY b2 index \N ihc3 16 \N 325047 Using index
1 PRIMARY d eq_ref PRIMARY PRIMARY 4 dolina.b2.productID 1
2 DERIVED b range ihc1 ihc1 4 \N 2808 Using where
2 DERIVED <derived3> ALL \N \N \N \N 531 Using where
3 DERIVED filtr_table range ihc1 ihc1 4 \N 22587 Using where

(Отредактировано автором: 26 Февраля, 2016 - 18:21:02)

 
 Top
Мелкий Супермодератор
Отправлено: 26 Февраля, 2016 - 14:14:16
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




0) Отформатируйте, пожалуйста, внятно запросы.
1) Напишите, какие где стоят индексы.
2) приложите результаты explain analyze для postgresql или просто explain, если у вас другая субд.


-----
PostgreSQL DBA
 
 Top
Sig
Отправлено: 26 Февраля, 2016 - 16:18:53
Post Id


Новичок


Покинул форум
Сообщений всего: 48
Дата рег-ции: Янв. 2012  


Помог: 0 раз(а)




я добавил индексы и explain
если есть программы как определить оптимальный индекс для запроса напишите пож-та ?
или почитать хорошо, как их использовать

---------
по запросам что я не так оформил напишите, я всё поправлю
 
 Top
Мелкий Супермодератор
Отправлено: 26 Февраля, 2016 - 16:47:00
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Оформить как-нибудь, чтобы запрос мог прочитать человек, а не только машина. Например,
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT DISTINCT seria_productID
  2.     FROM filtr_table
  3.     WHERE variantID IN (136,43)
  4.         AND seria_productID!=0
  5.     GROUP BY productID
  6.     HAVING count(productID)>=2


Какой оптимальный индекс из имеющихся в наличии - это решает планировщик базы. И по explain как раз видно, что он предполагает использовать.
Оптимальный индекс для запроса - вопрос к человеку.
Судя по тому, что вы упорно не хотите называть, какая у вас база - видимо, речь о MySQL. Тогда вот эта книжка: http://shop[dot]oreilly[dot]com/product/0636920022343[dot]do

пробую осмыслить, что есть и что из этого надо получить


-----
PostgreSQL DBA
 
 Top
Sig
Отправлено: 26 Февраля, 2016 - 18:22:34
Post Id


Новичок


Покинул форум
Сообщений всего: 48
Дата рег-ции: Янв. 2012  


Помог: 0 раз(а)




привёл к человеческому виду
да привильно MySQL
 
 Top
Мелкий Супермодератор
Отправлено: 27 Февраля, 2016 - 11:00:40
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Sig пишет:
задача
1. выбрали товар люстра (variantID = 43) и характеристику его 12 лампочек (variantID = 136)
2. определяем серии (seria_productID) где есть такой товар
3. проверяем есть ли в этой серии ещё бра и торшер (variantID in (3,41)), групируем по сериям, и делаем первые 20 серий (постраничная навигация)
4. добавляем к этим сериям все товары, и делаем сортировку где в начале выводим люстры (variantID = 43)

Вольная трактовка с минимизацией:
Нужно найти все seria_productID, в рамках одной серии обязательно должны быть люстра, лампочка, бра и торшер, определяемые по variantID, соответственно номера 43, 136, 3 и 41
Для этих seria_productID вывести все товары, в начале люстры.
По задаче невостребованными данными осталось - что такое 12 лампочек и как их надо учитывать?

Если я верно интерпретировал задачу, то решить можно как-то так:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT /**/ FROM shop_products
  2.     JOIN filtr_table USING(productID)
  3.     WHERE seria_productID IN (
  4.         SELECT seria_productID FROM filtr_table
  5.             WHERE productID IN (43, 136, 3, 41)
  6.             GROUP BY seria_productID
  7.             HAVING count(DISTINCT productID) = 4
  8.     );

Добавить индекс в таблице filtr_table productID & seria_productID и отдельно индекс seria_productID
Потом смотреть explain.


-----
PostgreSQL DBA
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB