За последние 24 часа нас посетили 17585 программистов и 1281 робот. Сейчас ищут 1463 программиста ...

Помогите создать сложный запрос.

Тема в разделе "MySQL", создана пользователем DioNiR, 24 мар 2007.

  1. DioNiR

    DioNiR Активный пользователь

    С нами с:
    24 мар 2007
    Сообщения:
    6
    Симпатии:
    0
    И так проблема такова.
    Мне нужно объединить 3 запроса либо в 1, либо в 2 запроса. Чтобы как нить сократить их число.
    И так есть 4 таблицы:
    Код (Text):
    1. CREATE TABLE `category` (
    2.   `c_id` int(6) NOT NULL auto_increment,
    3.   `c_title` varchar(100) NOT NULL,
    4.   `c_name_en` varchar(100) NOT NULL,
    5.   PRIMARY KEY  (`c_id`)
    6. ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1;
    7.  
    8. CREATE TABLE `goods` (
    9.   `g_id` int(6) NOT NULL auto_increment,
    10.   `g_cid` int(6) NOT NULL,
    11.   `g_count` int(6) NOT NULL,
    12.   `g_price` int(6) NOT NULL,
    13.   `g_status` int(1) default NULL,
    14.   PRIMARY KEY  (`g_id`)
    15. ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1;
    16.  
    17.  
    18.  
    19. CREATE TABLE `information_weeding` (
    20.   `ig_id` int(6) NOT NULL auto_increment,
    21.   `ig_wid` int(6) NOT NULL,
    22.   `ig_gid` int(6) NOT NULL,
    23.   `ig_text` text NOT NULL,
    24.   PRIMARY KEY  (`ig_id`)
    25. ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1;
    26.  
    27.  
    28. CREATE TABLE `weeding` (
    29.   `w_id` int(6) NOT NULL auto_increment,
    30.   `w_vid` int(6) NOT NULL,
    31.   `w_status` int(6) NOT NULL,
    32.   `w_html` int(1) NOT NULL,
    33.   `w_сonclusion_main` int(1) NOT NULL,
    34.   `w_title` varchar(100) NOT NULL,
    35.   `w_name_en` varchar(100) NOT NULL,
    36.   `w_comment` text NOT NULL,
    37.   PRIMARY KEY  (`w_id`)
    38. ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1;

    И есть код которым я получил нужный результат:
    Код (Text):
    1. $result = $DB->sql_query("SELECT
    2.     category.c_id,
    3.     category.c_title,
    4.     category.c_name_en,
    5.     goods.g_id,
    6.     goods.g_cid,
    7.     goods.g_count,
    8.     goods.g_price,
    9.     goods.g_status
    10. FROM
    11.     `goods`
    12.     JOIN `category` ON category.c_id = goods.g_cid
    13.     WHERE goods.g_status = '1' ORDER BY goods.g_id DESC LIMIT ".$NPS->Start('3',$_GET['page'],$num).", 3");
    14.  
    15. while($row = mysql_fetch_array($result)) {
    16.  
    17.     $parse->get_tpl("./templates/".$_CONFIG['template_name']."/shop/main_goods.tpl");
    18.     $parse->set_tpl('Price', $row['g_price']);
    19.  
    20.     $results = $DB->sql_query("SELECT * FROM `".$SQLprefix."weeding`");
    21.  
    22.     while($wed = mysql_fetch_array($results)) {
    23.  
    24.         $resultss = $DB->sql_query("SELECT * FROM `".$SQLprefix."information_weeding` WHERE `ig_wid` = '".$wed['w_id']."' AND `ig_gid` = '".$row['g_id']."' ");
    25.         if( $DB->sql_numrows() != 0 ) {
    26.  
    27.             while($inf = mysql_fetch_array($resultss)) {
    28.                 $parse->set_tpl($wed['w_name_en'], $wed['w_title'].": ".$inf['ig_text']);
    29.             }
    30.  
    31.         } else {
    32.             $parse->set_tpl($wed['w_name_en'], $wed['w_title'].": Не заполнено. ");
    33.         }
    34.  
    35.     }
    36.  
    37.     $parse->tpl_parse();
    38.     $text.= $parse->template;
    39.  
    40. }
    Вся беда в том, что у меня как видите, вышло в 3 запроса. А это не хорошо.

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

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

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

    Вот нужно уложиться в 1-2 запроса. Реально ли такое?
     
  2. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    если нет такого варианта, что в какой-либо из таблиц может быть запись, а может и не быть, относящаяся к данным из другой таблицы:

    [sql]SELECT ...
    FROM
    category AS c, goods AS g, information_weeding AS i, weeding AS w
    WHERE
    g.g_id = i.ig_gid
    AND
    g.cid = c.c_id
    AND
    i.ig_wid = w.w_id[/sql]