Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите создать сложный запрос. 
:(
    Опции темы
DioNiR
Дата 24.3.2007, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 30.12.2006

Репутация: нет
Всего: нет



И так проблема такова.
Мне нужно объединить 3 запроса либо в 1, либо в 2 запроса. Чтобы как нить сократить их число.
И так есть 4 таблицы:
Код
CREATE TABLE `category` (
  `c_id` int(6) NOT NULL auto_increment,
  `c_title` varchar(100) NOT NULL,
  `c_name_en` varchar(100) NOT NULL,
  PRIMARY KEY  (`c_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1;

CREATE TABLE `goods` (
  `g_id` int(6) NOT NULL auto_increment,
  `g_cid` int(6) NOT NULL,
  `g_count` int(6) NOT NULL,
  `g_price` int(6) NOT NULL,
  `g_status` int(1) default NULL,
  PRIMARY KEY  (`g_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1;



CREATE TABLE `information_weeding` (
  `ig_id` int(6) NOT NULL auto_increment,
  `ig_wid` int(6) NOT NULL,
  `ig_gid` int(6) NOT NULL,
  `ig_text` text NOT NULL,
  PRIMARY KEY  (`ig_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1;


CREATE TABLE `weeding` (
  `w_id` int(6) NOT NULL auto_increment,
  `w_vid` int(6) NOT NULL,
  `w_status` int(6) NOT NULL,
  `w_html` int(1) NOT NULL,
  `w_сonclusion_main` int(1) NOT NULL,
  `w_title` varchar(100) NOT NULL,
  `w_name_en` varchar(100) NOT NULL,
  `w_comment` text NOT NULL,
  PRIMARY KEY  (`w_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1;



И есть код которым я получил нужный результат:
Код
$result = $DB->sql_query("SELECT
    category.c_id,
    category.c_title,
    category.c_name_en,
    goods.g_id,
    goods.g_cid,
    goods.g_count,
    goods.g_price,
    goods.g_status
FROM
    `goods`
    JOIN `category` ON category.c_id = goods.g_cid
    WHERE goods.g_status = '1' ORDER BY goods.g_id DESC LIMIT ".$NPS->Start('3',$_GET['page'],$num).", 3");

while($row = mysql_fetch_array($result)) {

    $parse->get_tpl("./templates/".$_CONFIG['template_name']."/shop/main_goods.tpl");
    $parse->set_tpl('Price', $row['g_price']);

    $results = $DB->sql_query("SELECT * FROM `".$SQLprefix."weeding`");

    while($wed = mysql_fetch_array($results)) {

     $resultss = $DB->sql_query("SELECT * FROM `".$SQLprefix."information_weeding` WHERE `ig_wid` = '".$wed['w_id']."' AND `ig_gid` = '".$row['g_id']."' ");
      if( $DB->sql_numrows() != 0 ) {

           while($inf = mysql_fetch_array($resultss)) {
             $parse->set_tpl($wed['w_name_en'], $wed['w_title'].": ".$inf['ig_text']);
         }

        } else {
         $parse->set_tpl($wed['w_name_en'], $wed['w_title'].": Не заполнено. ");
        }

    }

    $parse->tpl_parse();
    $text.= $parse->template;

}


Вся беда в том, что у меня как видите, вышло в 3 запроса. А это не хорошо.

Последние 2 таблицы должны работать совместно.

Т.е weeding хранит информацию о полях. А information_weeding хранит значение этих полей для определенного ID.

Задача такова надо вывести все товары из таблицы goods.
Вывести названия категорий, которых хранятся в таблице category.
Вывести все поля, которые хранятся weeding и их значение которые хранятся в information_weeding.

Вот нужно уложиться в 1-2 запроса. Реально ли такое?
--------------------
Думали это конец? Ха, всё только начинается.
PM MAIL   Вверх
Maksys
Дата 26.3.2007, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Future Splasher
***


Профиль
Группа: Завсегдатай
Сообщений: 1289
Регистрация: 15.6.2005
Где: Екатеринбург

Репутация: нет
Всего: 17



Попробуй двойные запросы:
Код

sql_query("SELECT * FROM `".$SQLprefix."information_weeding` WHERE `ig_wid`IN ("SELECT * FROM `".$SQLprefix."weeding`") AND `ig_gid` = '".$row['g_id']."' ");



--------------------
 С уважением, BiMaWa™©.
user posted image
user posted image
PM MAIL ICQ Skype GTalk   Вверх
DioNiR
Дата 25.4.2007, 02:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 30.12.2006

Репутация: нет
Всего: нет



При большом кол-ва товаров оочень много запросов происходит :(
--------------------
Думали это конец? Ха, всё только начинается.
PM MAIL   Вверх
Maksys
Дата 25.4.2007, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Future Splasher
***


Профиль
Группа: Завсегдатай
Сообщений: 1289
Регистрация: 15.6.2005
Где: Екатеринбург

Репутация: нет
Всего: 17



Запросы не от количества товаров зависят а от количества выборки.


--------------------
 С уважением, BiMaWa™©.
user posted image
user posted image
PM MAIL ICQ Skype GTalk   Вверх
DioNiR
Дата 26.4.2007, 06:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 30.12.2006

Репутация: нет
Всего: нет



Обьединил запросы:
Код
SELECT * FROM
            `goods` g
            JOIN `weeding` w
            JOIN `category` c ON c.c_id = g.g_cid
            JOIN `information_weeding` iw ON iw.ig_gid = g.g_id AND w.w_id = iw.ig_wid
            WHERE g.g_status = '1'


Теперь почему он выводит один товар который находится в goods столько раз сколько строк в weeding.
--------------------
Думали это конец? Ха, всё только начинается.
PM MAIL   Вверх
SelenIT
Дата 26.4.2007, 08:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 6
Всего: 401



Всё правильно. Число строк в выборке из связанных таблиц равно числу всех возможных сочетаний, удовлетворяющих условиям связывания.

Можно, конечно, сгруппировать по g.g_id, а iw.ig_text слепить в одну строку с помощью GROUP_CONCAT, в скрипте обратно explode-нуть эту строку и т.д. Но, имхо, большого проку (кроме незначительной разгрузки MySQL-клиента) это не даст...


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
DioNiR
Дата 26.4.2007, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 30.12.2006

Репутация: нет
Всего: нет



И что хочешь сказть лучше сделать что +1 к запросу при показа 1 товара выгодней? 
--------------------
Думали это конец? Ха, всё только начинается.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0462 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.