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]   

> Описание: если данные в одной таблице а параметры для выбора в другой
IceCream
Отправлено: 25 Января, 2010 - 21:17:18
Post Id


Новичок


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


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




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

products - тут лежат все продукты с их числовыми параметрами
у неё есть колонки products_id products_model
products_to_products_extra_field s тут мы указываем какое доп. свойство есть у продукта и какое у него значение(а у доп свойства может быть множество, например: доп свойство размер, значения доп свойства размер - 41 и 42)
Вид:
products_id(id продукта) products_extra_fields_id('id доп. свойства) products_extra_fields_value(значение1 доп. свойства)
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. '1' 'цвет' 'белый'
  3. '1' 'цвет' 'синий'
  4.  
  5. '1' 'вес' '32'
  6. '1' 'вес' '44'
  7.  
  8. '2' 'цвет' 'белый'
  9. '2' 'цвет' 'синий'


теперь задача выбрать все products_id и products_model в таблице products
у которых products_extra_fields_id и products_extra_fields_value
равны 'цвет' и 'белый' а также 'вес' и '32'

формирую запрос:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT p.products_id,
  2. p.products_model,
  3. FROM products_to_products_extra_fields p2pef,  products p
  4. WHERE p.products_id = p2pef.products_id
  5. AND (p2pef.products_extra_fields_id = 'цвет' AND p2pef.products_extra_fields_value = 'белый')
  6. AND (p2pef.products_extra_fields_id = 'вес' AND p2pef.products_extra_fields_value = '32')


так возвращает 0

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT p.products_id,
  2. p.products_model,
  3. FROM products_to_products_extra_fields p2pef,  products p
  4. WHERE p.products_id = p2pef.products_id
  5. AND (p2pef.products_extra_fields_id = 'цвет' AND p2pef.products_extra_fields_value = 'белый')
  6. OR (p2pef.products_extra_fields_id = 'вес' AND p2pef.products_extra_fields_value = '32')


так выводит и те в которых p2pef.products_extra_fields_id = 'цвет' and p2pef.products_extra_fields_valu e = 'белый', и те в которых p2pef.products_extra_fields_id = 'вес' and p2pef.products_extra_fields_valu e = '32'

Причём один и тот же товар выводит то количество раз, которое соответствует количеству доп. свойств у него тобиш колличеству его products_id в таблице p2pef. Но тут всё понятно, это породило условие p.products_id = p2pef.products_id и решил я эту проблему использовав select distinct, но это только решило проблему дубликатов.

В общем мне кажется что я не правильно логически построил запрос, только вот как сделать это верно?


Отредактировано модератором: SAD, 26 Января, 2010 - 08:54:47
 
 Top
DarkWay666
Отправлено: 26 Января, 2010 - 15:02:50
Post Id



Забанен


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


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

[+][+]


я непойму зачем пристыковка? Однако
p.products_id
p2pef.products_extra_fields_id
p2pef.products_extra_fields_value
 
 Top
IceCream
Отправлено: 26 Января, 2010 - 23:13:56
Post Id


Новичок


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


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




DarkWay666 пишет:
я непойму зачем пристыковка? Однако
p.products_id
p2pef.products_extra_fields_id
p2pef.products_extra_fields_value


Просто в расширенной форме запроса используется порядка 6ти имён таблиц поэтому это нужно чтобы не писать кучу имён таблиц полностью.

ведь согласитесь, куда удобнее написать
p2pef.products_extra_fields_value
чем
products_to_products_extra_fields.products_extra_fields_value

Собственно вопрос решил так:
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT DISTINCT products_id
  3.                FROM products_to_products_extra_fields
  4.                WHERE (products_extra_fields_id = 'вес' AND products_extra_fields_value = '32')
  5. AND products_id = ANY
  6.                   (SELECT products_id
  7.                      FROM products_to_products_extra_fields
  8.                      WHERE (products_extra_fields_id = 'цвет' AND products_extra_fields_value = 'белый') ))
  9.  


так я получил все уникальные ID товаров у которых есть необходимы параметры с необходимыми значениями.
При условии что все связки параметр => значение я получаю динамически из GET строки, получился довольно удобный механизм разделения запроса на 2 части. в первой я предварительно сверив что такие параметры действительно соответствуют параметров товаров в данной категории провёл выборку ID товаров. И сразу определил есть ли такие товары вообще.
во второй, если такие товары есть выполняю выборку из 4х таблиц в базе все параметры необходимые вывести клиенту. Собственно этот запрос довольно громоздкий и первым запросом я снижаю нагрузку, хотя объединить его с этим не столь сложно.

Хотя вполне возможно есть более правильное решение данной задачи. Собственно чтобы узнать это я и создал данный топик.
 
 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