Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / РЕбят, помогите пожалуйста с запросом / 8 сообщений из 8, страница 1 из 1
21.05.2017, 18:07
    #39456905
aportx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
РЕбят, помогите пожалуйста с запросом
Запрос фильтрует по параметрам товары.
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
$query = "
SELECT DISTINCT p.*, pv.price, pv.compare_price, br.title AS b_title, br.url AS b_url, br.image AS b_image
FROM s_products AS p, s_products_variants AS pv, s_brands AS br, 
	s_products_brands AS pb, s_properties AS pr, s_products_properties AS prp, s_properties_values AS prv
WHERE p.is_active = 1
AND p.id = pv.product_id

AND pb.brand_id = br.id
AND p.id = pb.product_id

AND pr.id = prv.prop_id
AND prp.property_id = prv.id
AND p.id = prp.product_id
";


далее добавляются выборки
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
if($_get['queryString']){
	parse_str($_get['queryString'], $_get);
	// цена
	if($_get['f']['price_min']){
		$query .= " AND pv.price >= {$_get['f']['price_min']}";
	}
	if($_get['f']['price_max']){
		$query .= " AND pv.price <= {$_get['f']['price_max']}";
	}
	// бренд
	if($_get['f']['brand']){
		
		$_get_brands = $_get['f']['brand'];

		$query .= " AND (";
			foreach($_get_brands as $i => $value){
				if($value == 'on'){
					$query .= " pb.brand_id = {$i} OR";
				}
			}
			$query = rtrim($query,"OR");
		$query .= ")\r";
	}
	// чекбоксы
	if($_get['f']['checkbox']){
		
		$_get_checkbox = $_get['f']['checkbox']; //printr($_get_checkbox);
		
		$query .= " AND (";
			foreach($_get_checkbox as $key => $val){ // 6 ключ 27,28,29 значения (id s_properties_values)
				$query .= " (";
					foreach($val as $v){
						$query .= " ( prp.property_id = {$v} AND prv.id = {$v} ) OR";
					}
				$query = rtrim($query,"OR");
				$query .= ")\r OR";
			}
		$query = rtrim($query,"OR");
		$query .= ")\r";
	}
	
	$query .= " ORDER BY p.id LIMIT 500"; // лимит на результаты, чтобы браузер не лег
}


Цена и Бренд нормально фильтруются(таблицы одномерные, несвязанные), а вот чекбоксы нет.
Чекбоксы фильтруют параметры товаров, а это 3 таблицы:
>> s_products_brands AS pb, s_properties AS pr, s_products_properties AS prp, s_properties_values AS prv
Связаны они так:
>> AND pr.id = prv.prop_id AND prp.property_id = prv.id AND p.id = prp.product_id

Проблема в том, что чекбоксы сгруппированы в группы. Например от чекбоксов приходит массив:
ключ 6 значения 27,28,29 - где 6 это параметр "полярность", 27,28,29 это id вариантов полярности
Если отметить 27 и 28 то все ок, выборка расширяется и показывает больше товаров.

Но если дальше отметить еще один чекбокс в другой группе, например приходит
ключ 7 значения 30,31,32 - где 7 это параметр "пусковой ток", 30,31,32 это id вариантов пускового тока
Отмечаем чекбокс 30 выборка снова расширяется, а должна сужать из предыдущие выданные варианты

Пример того как должно работать - _https:_//www.emex.ru/catalogs/electro/accumulator/?page=1
...
Рейтинг: 0 / 0
21.05.2017, 22:41
    #39456965
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
РЕбят, помогите пожалуйста с запросом
aportx,

Покажите, пожалуйста, структуру таблиц (их DDL) и полный текст запроса, а не код, который его генерит.
...
Рейтинг: 0 / 0
21.05.2017, 23:18
    #39456976
aportx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
РЕбят, помогите пожалуйста с запросом
miksoft, что то не могу найти, как загрузить несколько картинок, ткните носом где кнопка прикрепить картинки )

сам запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT DISTINCT p.*, pv.price, pv.compare_price, br.title AS b_title, br.url AS b_url, br.image AS b_image
FROM s_products AS p, s_products_variants AS pv, s_brands AS br, s_products_brands AS pb, s_properties AS pr, s_products_properties AS prp, s_properties_values AS prv
WHERE p.is_active = 1
AND p.id = pv.product_id

AND pb.brand_id = br.id
AND p.id = pb.product_id

AND pr.id = prv.prop_id
AND prp.property_id = prv.id
AND p.id = prp.product_id
 AND pv.price <= 25000 AND ( pb.brand_id = 20 )
 AND ( ( ( prv.prop_id = 6 AND prv.id = 27 ) XOR ( prv.prop_id = 6 AND prv.id = 28 ) )
 OR ( ( prv.prop_id = 29 AND prv.id = 54 ) )
...
Рейтинг: 0 / 0
21.05.2017, 23:22
    #39456978
aportx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
РЕбят, помогите пожалуйста с запросом
miksoft, так подойдет структура?
структура таблиц
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
--  --------------------------------------------------------

--
-- Структура таблицы `s_brands`
--

CREATE TABLE IF NOT EXISTS `s_brands` (
`id` int(11) NOT NULL,
  `parent_id` int(11) NOT NULL,
  `title` varchar(255) NOT NULL,
  `description` text NOT NULL,
  `meta_title` varchar(500) NOT NULL,
  `meta_keywords` varchar(500) NOT NULL,
  `meta_description` varchar(500) NOT NULL,
  `url` varchar(255) NOT NULL,
  `image` varchar(255) NOT NULL,
  `is_active` tinyint(1) NOT NULL DEFAULT '1',
  `is_filter` tinyint(1) NOT NULL DEFAULT '0',
  `is_type` tinyint(1) NOT NULL DEFAULT '0'
) ENGINE=MyISAM AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- Структура таблицы `s_products`
--

CREATE TABLE IF NOT EXISTS `s_products` (
`id` int(11) NOT NULL,
  `url` varchar(255) NOT NULL DEFAULT '',
  `title` varchar(500) NOT NULL,
  `annotation` text NOT NULL,
  `description` longtext NOT NULL,
  `meta_title` varchar(500) NOT NULL,
  `meta_keywords` varchar(500) NOT NULL,
  `meta_description` varchar(500) NOT NULL,
  `created` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `availability` tinyint(1) DEFAULT NULL,
  `external_id` varchar(36) NOT NULL,
  `brand_id` int(11) DEFAULT NULL,
  `position` int(11) NOT NULL DEFAULT '0',
  `visible` tinyint(1) NOT NULL DEFAULT '1',
  `is_active` tinyint(1) NOT NULL DEFAULT '1',
  `is_novelty` tinyint(1) NOT NULL DEFAULT '0',
  `is_bestseller` tinyint(1) NOT NULL DEFAULT '0',
  `is_recommended` tinyint(1) NOT NULL DEFAULT '0'
) ENGINE=MyISAM AUTO_INCREMENT=323 DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- Структура таблицы `s_products_brands`
--

CREATE TABLE IF NOT EXISTS `s_products_brands` (
  `product_id` int(11) NOT NULL,
  `brand_id` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- Структура таблицы `s_products_categories`
--

CREATE TABLE IF NOT EXISTS `s_products_categories` (
  `product_id` int(11) NOT NULL,
  `category_id` int(11) NOT NULL,
  `base` tinyint(1) NOT NULL DEFAULT '0',
  `position` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- Структура таблицы `s_products_properties`
--

CREATE TABLE IF NOT EXISTS `s_products_properties` (
  `product_id` int(11) NOT NULL,
  `property_id` int(11) NOT NULL COMMENT 'property_val_id'
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- Структура таблицы `s_products_variants`
--

CREATE TABLE IF NOT EXISTS `s_products_variants` (
`id` int(11) NOT NULL,
  `product_id` int(11) NOT NULL,
  `sku` varchar(255) NOT NULL,
  `name` varchar(255) NOT NULL,
  `price` decimal(14,2) NOT NULL DEFAULT '0.00',
  `compare_price` decimal(14,2) DEFAULT NULL,
  `amount` mediumint(9) DEFAULT NULL,
  `position` int(11) NOT NULL,
  `attachment` varchar(255) NOT NULL,
  `external_id` varchar(36) NOT NULL
) ENGINE=MyISAM AUTO_INCREMENT=323 DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- Структура таблицы `s_properties`
--

CREATE TABLE IF NOT EXISTS `s_properties` (
`id` int(11) NOT NULL,
  `group_id` int(11) NOT NULL,
  `title` varchar(255) NOT NULL,
  `description` text NOT NULL,
  `units` varchar(50) NOT NULL,
  `type` tinyint(1) NOT NULL DEFAULT '1',
  `is_expanded` tinyint(1) NOT NULL DEFAULT '1',
  `is_filter` tinyint(1) NOT NULL DEFAULT '0',
  `is_details` tinyint(1) NOT NULL DEFAULT '0',
  `is_brief` tinyint(1) NOT NULL DEFAULT '0'
) ENGINE=MyISAM AUTO_INCREMENT=32 DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- Структура таблицы `s_properties_groups`
--

CREATE TABLE IF NOT EXISTS `s_properties_groups` (
`id` int(11) NOT NULL,
  `title` varchar(255) NOT NULL,
  `is_active` tinyint(1) NOT NULL DEFAULT '1'
) ENGINE=MyISAM AUTO_INCREMENT=28 DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- Структура таблицы `s_properties_values`
--

CREATE TABLE IF NOT EXISTS `s_properties_values` (
`id` int(11) NOT NULL,
  `prop_id` int(11) NOT NULL,
  `title` varchar(255) NOT NULL,
  `is_active` tinyint(1) NOT NULL DEFAULT '1'
) ENGINE=MyISAM AUTO_INCREMENT=369 DEFAULT CHARSET=utf8;

--
-- Индексы сохранённых таблиц
--

--
-- Индексы таблицы `s_brands`
--
ALTER TABLE `s_brands`
 ADD UNIQUE KEY `brand_id` (`id`);

--
-- Индексы таблицы `s_products`
--
ALTER TABLE `s_products`
 ADD PRIMARY KEY (`id`), ADD KEY `url` (`url`), ADD KEY `brand_id` (`brand_id`), ADD KEY `visible` (`visible`), ADD KEY `position` (`position`), ADD KEY `external_id` (`external_id`), ADD KEY `hit` (`availability`), ADD KEY `name` (`title`(333));

--
-- Индексы таблицы `s_products_brands`
--
ALTER TABLE `s_products_brands`
 ADD PRIMARY KEY (`product_id`,`brand_id`), ADD KEY `product_id` (`product_id`), ADD KEY `category_id` (`brand_id`);

--
-- Индексы таблицы `s_products_categories`
--
ALTER TABLE `s_products_categories`
 ADD PRIMARY KEY (`product_id`,`category_id`), ADD KEY `position` (`position`), ADD KEY `product_id` (`product_id`), ADD KEY `category_id` (`category_id`);

--
-- Индексы таблицы `s_products_properties`
--
ALTER TABLE `s_products_properties`
 ADD PRIMARY KEY (`product_id`,`property_id`), ADD KEY `product_id` (`product_id`), ADD KEY `feature_id` (`property_id`);

--
-- Индексы таблицы `s_products_variants`
--
ALTER TABLE `s_products_variants`
 ADD PRIMARY KEY (`id`), ADD KEY `product_id` (`product_id`), ADD KEY `sku` (`sku`), ADD KEY `price` (`price`), ADD KEY `stock` (`amount`), ADD KEY `position` (`position`), ADD KEY `external_id` (`external_id`);

--
-- Индексы таблицы `s_properties`
--
ALTER TABLE `s_properties`
 ADD UNIQUE KEY `brand_id` (`id`);

--
-- Индексы таблицы `s_properties_groups`
--
ALTER TABLE `s_properties_groups`
 ADD UNIQUE KEY `brand_id` (`id`);

--
-- Индексы таблицы `s_properties_values`
--
ALTER TABLE `s_properties_values`
 ADD UNIQUE KEY `prop_id` (`id`) USING BTREE;

--
-- AUTO_INCREMENT для сохранённых таблиц
--

--
-- AUTO_INCREMENT для таблицы `s_brands`
--
ALTER TABLE `s_brands`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=27;
--
-- AUTO_INCREMENT для таблицы `s_products`
--
ALTER TABLE `s_products`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=323;
--
-- AUTO_INCREMENT для таблицы `s_products_variants`
--
ALTER TABLE `s_products_variants`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=323;
--
-- AUTO_INCREMENT для таблицы `s_properties`
--
ALTER TABLE `s_properties`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=32;
--
-- AUTO_INCREMENT для таблицы `s_properties_groups`
--
ALTER TABLE `s_properties_groups`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=28;
--
-- AUTO_INCREMENT для таблицы `s_properties_values`
--
ALTER TABLE `s_properties_values`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=369;

...
Рейтинг: 0 / 0
22.05.2017, 01:22
    #39457003
aportx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
РЕбят, помогите пожалуйста с запросом
Ну хоть идею подкиньте, куда копать..
...
Рейтинг: 0 / 0
22.05.2017, 15:32
    #39457463
aportx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
РЕбят, помогите пожалуйста с запросом
нашел похожую тему http://www.sql.ru/forum/685384/pomogite-sostavit-zapros-na-vyborku-filtr-po-dopolnitelnym-polyam

но у меня таблицы другие..
не получается запрос составить по такому же принципу.
...
Рейтинг: 0 / 0
22.05.2017, 15:48
    #39457483
aportx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
РЕбят, помогите пожалуйста с запросом
Пробовал еще вот так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
SELECT DISTINCT
	p.*,
	pv.price,
	pv.compare_price,
	br.title AS b_title,
	br.url AS b_url,
	br.image AS b_image
FROM
	s_products AS p,
	s_products_variants AS pv,
	s_brands AS br,
	s_products_brands AS pb,
	s_properties AS pr,
	s_products_properties AS prp,
	s_properties_values AS prv
WHERE p.is_active = 1

AND p.id = pv.product_id

AND p.id = pb.product_id
AND pb.brand_id = br.id

AND p.id = prp.product_id
AND prv.id = prp.property_id
AND prv.prop_id = pr.id
AND pv.price <= 25000 AND ( pb.brand_id = 20 )
AND prv.prop_id IN (27,28) GROUP BY p.id having count(distinct prv.prop_id) = 2  
AND prv.prop_id IN (54) GROUP BY p.id having count(distinct prv.prop_id) = 1  
ORDER BY p.id LIMIT 300



Тоже неправильно сортирует, вообще каккуюто фигню выдает
...
Рейтинг: 0 / 0
22.05.2017, 20:52
    #39457677
aportx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
РЕбят, помогите пожалуйста с запросом
Запилил тестовый сайт http://coaper.beget.tech/catalog/automotive
Как тестировать то что описано выше:
1. слева в фильтре выбираем Бренд COUGAR
2. слева в фильтре выбираем Полярность - прямая
3. слева в фильтре выбираем Напряжение - 12 вольт
4. охреневаем от того что выдало, потому что выдача не должна поменяться, все аккумуляторы с прямой полярностью на 12 вольт
Запрос показанный выше соответственно неверный.
Как составить его правильно?
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / РЕбят, помогите пожалуйста с запросом / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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