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]   

> Без описания
dropoff
Отправлено: 26 Июля, 2012 - 09:12:56
Post Id



Посетитель


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


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




Доброго времени суток.

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

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT
  2.         *
  3. FROM
  4.         filter_value v
  5.                 INNER JOIN
  6.                         filter_name n ON (n.id = v.name_id)
  7. WHERE
  8.         n.cat = '".$category_id."'
  9. ORDER BY
  10.         v.name_id


Сюда пытаюсь добавить еще подсчет из таблицы
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT COUNT(param_prod_id) AS count FROM filter_param WHERE param_value_id = value_id


Т.е. нужно посчитать связи param_value_id = value_id
таблица filter_param как связь между товаром и значениями параметров
В итоге, выводить число param_prod_id(сколько к значению параметра привязано товаров)
Пробовал делать запрос в запросе, джоинить. Получается все время что-то не то(
 
 Top
EuGen Администратор
Отправлено: 26 Июля, 2012 - 09:18:55
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




Не понятно до конца. Приведите структуру таблиц и бизнес-связей в Вашем приложении. А так же то, что хотелось бы получить (по возможности на примере).


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
dropoff
Отправлено: 26 Июля, 2012 - 09:56:27
Post Id



Посетитель


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


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




Первая таблица - параметры
CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE IF NOT EXISTS `filter_name` (
  2.                 `id` int(11) NOT NULL AUTO_INCREMENT,
  3.                 `name` varchar(255) DEFAULT NULL,
  4.                 `type` varchar(255) NOT NULL DEFAULT '',
  5.                 `cat` int NOT NULL,
  6.         PRIMARY KEY (`id`)
  7.         )ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=0;


cat - это ID категории товаров к которому привязывается параметр. Чтобы у каждой категории товаров были свои параметры.


Вторая таблица - это значения параметров (т.е. первая таблица как бы категория)
CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE IF NOT EXISTS `filter_value` (
  2.                 `value_id` int(11) NOT NULL AUTO_INCREMENT,
  3.                 `value_title` varchar(255) DEFAULT NULL,
  4.                 `name_id` int NOT NULL,
  5.         PRIMARY KEY (`value_id`)
  6.         )ENGINE=MyISAM DEFAULT CHARSET=utf8;


name_id - это ID параметра из первой таблицы


Третья таблица уже для связи значения параметра с товаром
CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE IF NOT EXISTS filter_param (
  2.                 param_id int NOT NULL AUTO_INCREMENT,
  3.                 param_product_id int NOT NULL,
  4.                 param_value_id int NOT NULL,
  5.                 PRIMARY KEY (param_id),
  6.                 KEY `product_id` (`param_product_id`)
  7.         ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE utf8_general_ci;


param_product_id - это id товара который привязывается к значению параметра param_value_id из второй таблицы.
Т.е. при редактировании товара я выбираю необходимые значения параметров и делаю между ними связь.


мне нужно посчитать сколько связей у value_id из второй таблицы с третьей param_value_id, чтобы вывести в списки количество связей. Образно говоря выводить количество товара привязанное к значению параметра.
Приложил скрин. То, что выделено красным - это количество товара привязанное к этим значениям параметров.
_ttp://i080.radikal.ru/1207/6a/89864b20dff7.png
(Добавление)
Вообще я как бы первый раз делаю такое. По этому скорее всего что-то упускаю.
суть в том, чтобы посчитать количество товара привязанных к значениям параметров.

Например человек выбирает определенный параметры из списка. Нужно считать у скольких товаров еще остался этот параметр(выбранный), чтобы можно было продолжать отсеивать их дальше.

Пример _ttp://jorange.ru/uploaded/modules/Osnovnoe_960.jpg
Тут выбрано значение параметра и всплыло окошко "Выбрано продуктов 2"
Т.е. получился пересчет значений и связий с товарами.
Вот никак не получается въехать как это все организовать.
 
 Top
EuGen Администратор
Отправлено: 26 Июля, 2012 - 10:16:00
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




Насчет третьей таблицы я не очень понял. Если по Вашей логике, Вы с самого начала начинаете привязывать некоторые параметры к категории, то почему потом Вы привязываете их к товару? Мне кажется, корректнее было бы помещать товар в категорию, которую уже в дальнейшем описывать параметрами. Но и сама схема такого описания кажется мне несколько странной. Так как изначальная задача здесь не озвучена, предложений по архитектуре делать не могу, но подумайте над ней.
По поводу выборки - это, насколько я понимаю,
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT
  2.   filter_value.value_id,
  3.   filter_name. name,
  4.   COUNT(filter_param.param_id) AS filter_count
  5. FROM
  6.   filter_value
  7.   LEFT JOIN filter_name ON filter_value.name_id=filter_name.id
  8.   LEFT JOIN filter_param ON filter_value.id=filter_param.value_id
  9. GROUP BY
  10.   filter_param.value_id
  11. WHERE
  12.   filter_name.cat=$cat
  13. ORDER BY
  14.   filter_name.name


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
dropoff
Отправлено: 26 Июля, 2012 - 10:19:56
Post Id



Посетитель


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


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




Есть параметр, скажем Цвет. У него есть значения: красный, синий, зеленый.
Так вот, я привязываю Параметр к категории, потому как в этой категории товары могут разных цветов. А вот к товару я уже выбираю необходимые Значения параметра, т.е. цвета. Потому как товар может быть только красного цвета и синего, а зеленого может быть другой товар из этой категории.
(Добавление)
Спасибо, сейчас попробую запрос.
 
 Top
EuGen Администратор
Отправлено: 26 Июля, 2012 - 10:24:04
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




dropoff
Тогда не понятно, как можно создавать товары с собственными свойствами, ведь товары одной категории в общем случае могут разниться. Или же нужно очень мелко разбивать категории, чтобы максимально четко помещать в них все возможные ответствления свойств товаров, что в дальнейшем создаст трудности из-за их большого количества.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
dropoff
Отправлено: 26 Июля, 2012 - 10:33:43
Post Id



Посетитель


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


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




Ну как. Если категория Телевизоры и к ней привязаны параметры: Диагональ(значения: 40", 47"), Разрешение (значения: 1024x768, 1365x768) и т.д... То есть все параметры именно для телевизоров.
Если в категории разнотипные параметры, то уже на усмотрение, какие параметры создавать и привязывать.

Может я Вашей мысли не понял? Я просто первый раз делаю такие связи. По этому могу что-то упускать в структуре.
 
 Top
EuGen Администратор
Отправлено: 26 Июля, 2012 - 10:37:06
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




Я имел ввиду случаи, когда товар имеет свойства категории и в то же время некоторые уникальные свои, не присущие другим товарам в этой категории (установлен какой-либо нестандартный модуль и т.п.) - или же у него и вовсе отсутствуют некоторые свойства из назначенной ему категории.
В целом, если товары типовые, привязка к категории допустима, но если часты случаи обособленных товаров, такая привязка будет создавать сложности, которые я описал выше.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
dropoff
Отправлено: 26 Июля, 2012 - 10:44:08
Post Id



Посетитель


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


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




Ну это только для какой-то общей фильтрации. Выводить полностью все "характеристики" товара в фильтр не обязательно.

А, видимо понял о чем Вы. Я делаю не набор из ВСЕХ параметров товара.
Все "характеристики" товаров забиваются отдельно в дополнительных полях.
А эти параметры - просто дополнительный функционал для удобного отсеивания товара.
Т.е. параметры не содержат все сразу, а только то, что добавит админи отдельно.
(Добавление)
Попробовал запрос.
Вывелись не все параметры, а только те, к чьим значениям привязаны товары.
Можно как-то выводить все параметры и значения привязанные к категории?
Вот наглядный пример (прошу прощения за длинную ссыль) _ttp://mvideo.ru/listing1.php?dir=1&class=1&sort=4&direct=&filter=8%3D231_12%22%2830.5+%F1%EC%29;8=231_15.6%22(39.6%20%F1%EC)

Тут вот в левой колонке видно, что выделены значения параметра "Диагональ"
12"(30.5 см) (1)
15.6" (39.6 см) (1)

При этом те, которые пустые (имеют 0 товаров) то же выводятся, но выбрать их нельзя.
 
 Top
EuGen Администратор
Отправлено: 26 Июля, 2012 - 11:29:11
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




Хм. Насколько я понимаю Вашу задачу, для этого достаточно применить RIGHT JOIN вместо LEFT JOIN на таблицу параметров (в предложенном мной запросе этот JOIN идет первым) - или же поменять местами присоединяющиеся таблицы.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
dropoff
Отправлено: 26 Июля, 2012 - 11:45:32
Post Id



Посетитель


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


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




неа. не получается. пробовал менять местами, менял LEFT на RIGHT....
(Добавление)
Вроде получилось.
заменил
GROUP BY
filter_param.value_id

на
GROUP BY
filter_value.value_id

вроде корректно все.
 
 Top
dropoff
Отправлено: 27 Июля, 2012 - 09:02:24
Post Id



Посетитель


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


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




EuGen, спасибо, все работает.

Еще такой вопрос.
Есть параметры

Цвет
- Красный (товаров 1)
- Синий (товаров 3)
- Зеленый (товаров 0)

Количество товаров - это к скольким товарам привязаны цвета.

Помечаю чекбокс у Красный - выскакивает окошко, где написано "Найдено товаров: 1 - Смотреть"
Далее помечаю чекбокс у Синий - выскакивает окошко, где написано "Найдено товаров: ## - Смотреть"
Где ## - нужно вывести количество найденных товаров к которым привязаны ОБА параметра Красный и Синий.
Соответственно, результат может быть либо 1, либо 0
1 - оба цвета привязаны к одному товару (Красный - товаров 1)
0 - оба цвета привязаны к разным товарам

Если же выбрать ЕЩЕ и Зеленый (товаров 0) вместе с остальными, то результат должен быть 0, потому как он не привязан к товарам вообще

Значения товаров у меня приходят массивом, разбиваю их запятыми и
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT COUNT(*) AS count FROM filter_param WHERE `param_value_id` IN (".implode(',',$val).")

Нужно как-то разбирать в цикле все, что пришло и искать соответствия? Ничего в голову не приходит.

Структура таблицы связей
param_id - id самой записи
param_product_id - id товара
param_value_id - id значения (красный, синий или зеленый)

Не могу сообразить как это все реализовать(
 
 Top
dropoff
Отправлено: 28 Июля, 2012 - 11:31:50
Post Id



Посетитель


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


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




Ребят, подскажите пожалуйста.
Сколько не пытаюсь, не получается сделать такое отсеивание.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB