Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Запрос выдает нулевой результат, почему?
 
 автор: TetRiska   (09.11.2012 в 16:47)   письмо автору
 
 

Всем привет. Есть список ИД товаров (полученный запросом), после чего я каждый ИД подставляю в следующий запрос с определенны условием 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

Как быть в этом случае?

П.С. Данный вопрос есть продолжением прошлой темы, но здесь мне нужно исправить сам запрос. Там я прилагал скрин, где много галочек, ползунков и тд. Т.е. юзер выбирает, что ему нужно, и все сыпется в условие, тем самым уменьшая количество товаров на вывод.

  Ответить  
 
 автор: Sfinks   (09.11.2012 в 20:57)   письмо автору
 
   для: 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, что не возможно.
Вывод: Вы вообще не правильно строите запрос.

Посмотрите вот эту соседнюю тему. Там, по-моему, решается похожая задача.

Если не разберетесь, то опишите таблицы своей БД как там и словами, пример того, что должен выбрать запрос. Тогда попробую вам составить пример правильного запроса.

  Ответить  
 
 автор: TetRiska   (09.11.2012 в 22:28)   письмо автору
 
   для: 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 для дальнейших манипуляций.

  Ответить  
 
 автор: Sfinks   (10.11.2012 в 00:41)   письмо автору
 
   для: 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 год выпуска.
За "трактор" отвечает поле такое-то, за "с пробегом" такое, а вот за год - такое. И т.д.... Но только по теме, а не как пользователь куда тыркает и что при этом видит.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования