|
|
|
| Всем привет. Есть список ИД товаров (полученный запросом), после чего я каждый ИД подставляю в следующий запрос с определенны условием AND
$id_array = array(
440,
1724,
1725,
1787,
7345,
7347,
7405,
7406,
8675,
8678,
8685,
8699,
8702,
10923,
10924,
10926,
10943,
10947,
10948,
37777,
14783,
14785,
14787,
22299,
22306,
22312,
22318,
22341,
22343,
22346,
22347,
26394,
26395,
27385,
28180,
29947,
30801,
30802,
30804,
30806,
30808,
30810,
32873,
32877,
32960,
32966,
32967,
32968,
33956,
33957,
33958,
33959,
33960,
33961,
34047,
34049,
34053,
34490,
34497,
34506,
34508,
34840,
35101,
35104,
35102,
35103,
35523,
36343
);
$id_count = count($id_array);
$cnt=0;
for($cc=0;$cc<$id_count;$cc++){
$prin = "
SELECT `em_produce_int_id`
FROM `em_produce_int`
WHERE `em_produce_id` = ".$id_array[$cc]."
AND `em_values_reference_id` = 813
AND `em_values_reference_id` = 818
";
$prin = select_query($prin);
$cnt += $prin['count'];
}
echo $cnt;
|
В результате выводит 0, но должно 3. Т.к. 813 и 818 одновременно встречаются в 3-х товарах. Пробовал и так:
AND `em_values_reference_id` IN (813,818)
|
Выводит 7 - не верно. Где я ошибся?
Приложил скрин таблицы - http://s42.radikal.ru/i095/1211/53/8dca34e5ad3f.png . Выходит, что 813 и 818 находятся в 2-х строках таблицы, а запросом я ищу оба значения в 1-й. Как исправить запрос?
я забыл упомянуть одну деталь, в запрос может быть подставляться разное количество AND em_values_reference_id а также быть выборка в диапазоне
SELECT `em_produce_int_id`
FROM `em_produce_int`
WHERE `em_produce_id` = ".$id_array[$cc]."
AND `em_values_reference_id` = 813
AND `em_values_reference_id` = 818
AND `em_values_reference_id` = 41
AND `em_values_reference_id` = 4561
AND `em_reference_values_id` = 14 AND `em_produce_int_val` BETWEEN 220 AND 966
AND `em_values_reference_id` = 11
AND `em_values_reference_id` = 1
AND `em_values_reference_id` = 905
AND `em_values_reference_id` = 674
AND `em_reference_values_id` = 300 AND `em_produce_int_val` BETWEEN 0 AND 665097
|
Как быть в этом случае?
П.С. Данный вопрос есть продолжением прошлой темы, но здесь мне нужно исправить сам запрос. Там я прилагал скрин, где много галочек, ползунков и тд. Т.е. юзер выбирает, что ему нужно, и все сыпется в условие, тем самым уменьшая количество товаров на вывод. | |
|
|
|
|
|
|
|
для: TetRiska
(09.11.2012 в 16:47)
| |
WHERE `em_produce_id` = 35102 AND `em_values_reference_id` = 813 AND `em_values_reference_id` = 818
| относится не к одному товару, а к одной строке таблицы. Т.е. в одной и той же строке `em_values_reference_id` должно бить = 813 и = 818, что не возможно.
Вывод: Вы вообще не правильно строите запрос.
Посмотрите вот эту соседнюю тему. Там, по-моему, решается похожая задача.
Если не разберетесь, то опишите таблицы своей БД как там и словами, пример того, что должен выбрать запрос. Тогда попробую вам составить пример правильного запроса. | |
|
|
|
|
|
|
|
для: Sfinks
(09.11.2012 в 20:57)
| | Пройдемся поэтапно, чтоб было все ясно.
Есть форма фильтрации (!!!не реклама!!! если нужно посмотреть форму пройдите _http://www.engine-market.ua/ вместо wwww поставьте beta и нажмите на кнопку ТЫРК ниже меню слева).
Фильтрация состоит из 2-х частей:
- Первая часть статическая, там поля для фильтрации загружаются вместе с формой. Здесь проблем нет.
- Вторая часть динамическая, в зависимости от выбора в первой части, у нас будет формироваться разный набор полей для фильтрации во второй части.
Сейчас работаю над счетчиком. С ним как раз и проблема, а именно в запросе. Нужно отобранные пользователем данные корректно подставить в запрос, чтобы при наращивании отбора по фильтрам, счетчик уменьшался, ну как бы логично.
Вот запрос, который мне дает список ИД товаров по первой части и является также счетчиком:
$prod = "
SELECT a.`em_produce_id`
FROM `em_produce` a
JOIN `em_company` b ON (b.`em_company_id` = a.`em_company_id` AND b.`em_company_access` = 'y' AND b.`em_company_deleted` = 'n')
JOIN `em_business_group` c ON (c.`em_business_group_id` = a.`em_business_group_id` AND c.`em_business_group_access` = 'y' AND c.`em_business_group_deleted` = 'n')
WHERE a.`em_produce_group` = 32
AND a.`em_produce_access` = 'y'
AND a.`em_produce_deleted` = 'n'
";
$prod = select_query($prod);
|
Второй запрос принимает этот список ИД товаров и список ИД отобранных фильтров от пользователя:
$prin = "
SELECT `em_produce_id`
FROM `em_produce_int`
WHERE `em_produce_id` IN (35101,35104,35102,35103,35523,36343)
AND `em_values_reference_id` IN (813,818)
GROUP BY `em_produce_id`
HAVING COUNT(DISTINCT `em_values_reference_id`) = 2
";
$prin = select_query($prin);
echo $prin['count'];
|
Сейчас вывод верен - 3 товара, они как раз содержат оба ИД фильтра 813 и 818.
Во второй части есть еще ползунки, диапазон значений. Т.е. во второй запрос нужно добавить:
AND `em_reference_values_id` = значение AND `em_produce_int_val` BETWEEN мин AND макс
|
Естественно пользователь может выбрать несколько диапазонов.
Если есть и диапазоны, то тогда лучше запрос преобразовать к следующему виду?
$prin = "
SELECT `em_produce_id`
FROM `em_produce_int`
WHERE `em_produce_id` IN (35101,35104,35102,35103,35523,36343)
AND
(
`em_values_reference_id` = 813
OR
`em_values_reference_id` = 818
OR
(`em_reference_values_id` = 14 AND `em_produce_int_val` BETWEEN 220 AND 966)
OR
(`em_reference_values_id` = 34 AND `em_produce_int_val` BETWEEN 0 AND 67553)
)
GROUP BY `em_produce_id`
HAVING COUNT(DISTINCT `em_values_reference_id`) = 2
";
$prin = select_query($prin);
|
Вот весь бекап таблицы - http://files.mail.ru/O0TZXS для дальнейших манипуляций. | |
|
|
|
|
|
|
|
для: TetRiska
(09.11.2012 в 22:28)
| | Как в соседней ветке форума метко сказал один не очень сдержанный отвечающий: -Вы всегда, когда вас просят спеть, танцуете?
Попросил показать структуру таблиц и описать запрос.
Вместо этого получил дамп на 200 тысяч строк непонятных цифр и рассказ про какую-то неработающую форму.
Ну, слава богу, SHOW CREATE TABLE:
CREATE TABLE `em_produce_int` (
`em_produce_int_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`em_values_reference_id` smallint(4) unsigned NOT NULL DEFAULT '0',
`em_reference_values_id` smallint(4) unsigned NOT NULL DEFAULT '0',
`em_category_id` smallint(5) unsigned NOT NULL DEFAULT '0',
`em_produce_id` mediumint(7) unsigned NOT NULL DEFAULT '0',
`em_produce_int_val` decimal(9,3) unsigned NOT NULL DEFAULT '0.000',
PRIMARY KEY (`em_produce_int_id`)
) ENGINE=MyISAM AUTO_INCREMENT=202028 DEFAULT CHARSET=utf8
| я из этого дампа извлек. Но что обозначает какое поле, как они между собой связаны, а главное какие данные по какому принципу должны выбираться при каком-то определенном выборе пользователя, я так и не узнал.
Вы можете человеческим языком объяснить???
Например пользователь выбрал трактор с пробегом с 86 по 93 год выпуска.
За "трактор" отвечает поле такое-то, за "с пробегом" такое, а вот за год - такое. И т.д.... Но только по теме, а не как пользователь куда тыркает и что при этом видит. | |
|
|
|
|