powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / РЕбят, помогите пожалуйста с запросом
8 сообщений из 8, страница 1 из 1
РЕбят, помогите пожалуйста с запросом
    #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
РЕбят, помогите пожалуйста с запросом
    #39456965
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aportx,

Покажите, пожалуйста, структуру таблиц (их DDL) и полный текст запроса, а не код, который его генерит.
...
Рейтинг: 0 / 0
РЕбят, помогите пожалуйста с запросом
    #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
РЕбят, помогите пожалуйста с запросом
    #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
РЕбят, помогите пожалуйста с запросом
    #39457003
aportx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну хоть идею подкиньте, куда копать..
...
Рейтинг: 0 / 0
РЕбят, помогите пожалуйста с запросом
    #39457463
aportx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
нашел похожую тему http://www.sql.ru/forum/685384/pomogite-sostavit-zapros-na-vyborku-filtr-po-dopolnitelnym-polyam

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


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