Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Непростая выборка
 
 автор: Zilog   (14.04.2010 в 01:14)   письмо автору
 
 

Тблица 1
g_id
g_caption

Тблица 2
gp_id
g_id (указатель на т.1)
p_id (указатель на т.3)
gp_text

Тблица 3
p_id

Тблица 4
pv_id
p_id (указатель на т.3)
pv_text


Если словами:
а) есть товары (т1), есть свойства товаров (т2), есть типы свойств (т3), есть значения типов свойств (т4);
б) одно свойство может принимать несколько заранее заданных значений на выбор;
в) каждый товар может иметь несколько свойств;

Задача — сделать фльтр; вытащить все товары, удовлетворяющие заданным свойствам.
На входе имеем p_id (тип свойства) и pv_id(id значения для этого свойства); всё это допустим для двух типо свойств («хочу видеть красные и зелёные яблоки»).

Работает у меня фильтр только если выбран один критерий (тип + ид_значения). А вот если критерия два - уже не работает.

делаю так (т.3 в запросе не учавствует):

SELECT * FROM 
goods as g, 
goods_prop as gp, 
ptype_values as pv 
WHERE g.goodTreeID=159 
AND gp.goodID = g.goodID 
AND pv.ptypeID = gp.ptypeID 
AND pv.ptypeValue = gp.propValue
 AND gp.ptypeID=40  — тип
AND pv.ptypeValueID=38 — ид_значения
AND gp.ptypeID=39   — тип
AND pv.ptypeValueID=31 — ид_значения


Буду признателен за помощь. спасибо.

  Ответить  
 
 автор: Trianon   (14.04.2010 в 01:42)   письмо автору
 
   для: Zilog   (14.04.2010 в 01:14)
 

> «хочу видеть красные и зелёные яблоки»
красные и зеленые
или
красные либо зеленые
?

  Ответить  
 
 автор: Zilog   (14.04.2010 в 01:54)   письмо автору
 
   для: Trianon   (14.04.2010 в 01:42)
 

И!

  Ответить  
 
 автор: Trianon   (14.04.2010 в 02:07)   письмо автору
 
   для: Zilog   (14.04.2010 в 01:54)
 

Вы можете представить себе яблоко, которое одновременно и красное и зеленое со всех сторон?

  Ответить  
 
 автор: Zilog   (14.04.2010 в 02:13)   письмо автору
 
   для: Trianon   (14.04.2010 в 02:07)
 

>Вы можете представить себе яблоко, которое одновременно и красное и зеленое со всех сторон?

ну речь то идёт о разных яблоках :)
понимю, код кривой — по этому и зов о помощи.

upd
а, стоп, отупел к ночи. Конечно, тип - цвет.
Переформулировка: «дайте зелёные яблоки сорта грин»
цвет и сорт - типы свойств
зелёные и грин - значения

только вот нюанс - таблице свойств товаров хранится не id значения, а текст.

  Ответить  
 
 автор: Trianon   (14.04.2010 в 02:17)   письмо автору
 
   для: Zilog   (14.04.2010 в 02:13)
 

>ну речь то идёт о разных яблоках :)
нет, увы.
Речь в каждом конкретном случае идет об одном конкретном - очередном в очереди - яблоке, которое либо проходит фильтр либо отсеивается им.

  Ответить  
 
 автор: Zilog   (14.04.2010 в 02:19)   письмо автору
 
   для: Trianon   (14.04.2010 в 02:17)
 

>нет, увы.

даже с учётом переформулировки?

  Ответить  
 
 автор: Trianon   (14.04.2010 в 02:20)   письмо автору
 
   для: Zilog   (14.04.2010 в 02:19)
 

добавил.
Хотя утверждение о конкретном яблоке всё равно истинно.
Зеленое яблоко сорта антоновка я представить себе могу.
Красное - с трудом.

  Ответить  
 
 автор: Trianon   (14.04.2010 в 02:20)   письмо автору
 
   для: Trianon   (14.04.2010 в 02:17)
 

UPD.
А тогда ptypeValueID (да и typeID тоже) должны оцениваться из разных псевдонимов таблицы значений (и свойств соответственно).
AND gp1.ptypeID=40 — тип
AND pv1.ptypeValueID=38 — ид_значения
AND gp2.ptypeID=39 — тип
AND pv2.ptypeValueID=31 — ид_значения

  Ответить  
 
 автор: Zilog   (14.04.2010 в 02:24)   письмо автору
 
   для: Trianon   (14.04.2010 в 02:20)
 

>UPD.
>А тогда ptypeValueID (да и typeID тоже) должны оцениваться из разных псевдонимов таблицы значений (и свойств соответственно).

а если критериев - 10? генерить псевдонимы?

  Ответить  
 
 автор: Trianon   (14.04.2010 в 02:24)   письмо автору
 
   для: Zilog   (14.04.2010 в 02:24)
 

А если 100?
Ну дурацкий же вопрос.

  Ответить  
 
 автор: Zilog   (14.04.2010 в 02:25)   письмо автору
 
   для: Trianon   (14.04.2010 в 02:24)
 

>А если 100?
>Ну дурацкий же вопрос.

Вопрос нормальный — мало ли, может способы попроще есть.

Спасибо, пошёл сортировать яблоки.

  Ответить  
 
 автор: Zilog   (14.04.2010 в 02:28)   письмо автору
 
   для: Zilog   (14.04.2010 в 02:25)
 

Хотя, яблоком чую, наверняка должен быть способ покрасивее.

  Ответить  
 
 автор: Trianon   (14.04.2010 в 02:29)   письмо автору
 
   для: Zilog   (14.04.2010 в 02:28)
 

косметически - есть.
Убрать все эти межтабличные запятые. Меня лично от них тошнит.
Поставить JOIN ... ON

Ограничениена число JOINов в MySQL вроде как 61. Хватит на первых порах?

  Ответить  
 
 автор: Trianon   (14.04.2010 в 02:34)   письмо автору
 
   для: Trianon   (14.04.2010 в 02:29)
 

to Zilog (14.04.2010 в 02:31)

Скорректируйте последний пост.
Сделайте переносы в коде.
Окно рвет шаблон - до кнопки "ответить" не дотянуться.

И никогда больше так код не постите.

UPD. Спасибо.

  Ответить  
 
 автор: Trianon   (14.04.2010 в 02:28)   письмо автору
 
   для: Zilog   (14.04.2010 в 02:25)
 

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

  Ответить  
 
 автор: Zilog   (14.04.2010 в 02:31)   письмо автору
 
   для: Trianon   (14.04.2010 в 02:28)
 

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

Не спорю.

подсмотрел где то такой вариант:
SELECT * FROM module_magazine_articles AS art 
JOIN module_magazine_artproperty AS ap ON art.catID = 22
 WHERE ap.artID = art.ArtID AND ap.cpID = 21 
AND ap.apValue = 12 AND ap.cpID = 53 AND ap.apValue = 43 GROUP BY art.artID 


и работает.

у меня несколько иная структура, но смысл тот же — думаю я ошибся в структуре, храня свойство товара как текст (т2), без id откуда оно родом.

  Ответить  
 
 автор: Trianon   (14.04.2010 в 02:37)   письмо автору
 
   для: Zilog   (14.04.2010 в 02:31)
 

ap.cpID = 21 AND неважно AND ap.cpID = 53

Что - опять красно-зеленые яблоки покоя не дают? :)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования