Mysql查询优化并减少查询次数

时间:2014-10-09 06:28:08

标签: php mysql stored-procedures views query-optimization

我正在使用PHP& MYSQL数据库,我想获取特定帐户上方的详细信息。我正在使用4个查询来获取帐户“amar”的详细信息。 我的要求是我必须只使用一个查询,我必须减少执行时间并改进查询优化。我认为,如果我们使用视图或存储过程概念会更好。我在sqlfiddle.com上创建了一个小提琴。 This is link

要求:

  1. 分配给帐户的产品价格总和(amar)。产品必须分配到“category1”或“category2”类别。
  2. 分配到帐户的产品数量(amar)。产品必须分配到“category1”或“category2”类别。
  3. 对于以上两个要求,我使用了以下查询。

    select  SUM(p.price) as sum , count(p.id) as count from account as a left join aproduct as p on a.id = p.account_id and p.category in ('category1','category2') where a.id = '1' group by a.id 
    
    1. 获取分配给该帐户的产品总数(amar)。
    2. 对于上述要求,我使用了以下查询。

      select a.id , a.name,   count(p.id)   from account as a left join aproduct as  p on a.id = p.account_id  where a.id = '1'   group by a.id
      
      1. 在帐户(amar)中,获取产品的最早添加日期+ 115天,其中产品分配到“category1”或“category2”类别
      2. 对于上述要求,我使用了以下查询。

         select a.id , a.name ,   ( select ADDDATE( MIN(p.added_date)  ,  INTERVAL  115 DAY   ) ) as added_date  from account as a left join aproduct as  p on a.id = p.account_id  and  p.category IN ('category1','category2')  where a.id = '1'  group by a.id 
        
        1. 在帐户(amar)中,获取产品的available_date的最早日期,其中产品分配到“category1”或“category2”类别
        2. 在帐户(amar)中,获取产品的available_date的第二个最早日期,其中产品分配到“category1”或“category2”类别
        3. 在帐户(amar)中,获取产品的available_date的第三个最早日期,其中产品分配到“category1”或“category2”类别
        4. 对于以上三个要求,我认为我们可以使用以下查询获取记录

          select a.id , a.name , p.available_date as added_date  from account as a left join aproduct as  p on a.id = p.account_id  and  p.category IN ('category1','category2')  where a.id = '1' order by p.available_date asc limit 0,3 
          

          我对我想要的最终查询的假设:

          select sum, count, min(added_date), first_oldest_date, second_oldest_date, third_oldest_date from table or view or stored procedure  where account.id = '1' 
          

          MY SQL DATABASE&表格定义。

          CREATE TABLE IF NOT EXISTS `account` (
            `id` int(11) NOT NULL AUTO_INCREMENT,
            `name` varchar(255) NOT NULL,
            `date` date NOT NULL,
            PRIMARY KEY (`id`)
          ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
          
          --
          -- Dumping data for table `account`
          --
          
          INSERT INTO `account` (`id`, `name`, `date`) VALUES
          (1, 'amar', '2014-10-06'),
          (2, 'kumar', '2014-10-14'),
          (3, 'ram', '2014-10-13');
          
          -- --------------------------------------------------------
          
          --
          -- Table structure for table `aproduct`
          --
          
          CREATE TABLE IF NOT EXISTS `aproduct` (
            `id` int(11) NOT NULL AUTO_INCREMENT,
            `account_id` int(11) NOT NULL,
            `name` varchar(254) NOT NULL,
            `price` varchar(255) NOT NULL,
            `category` varchar(255) NOT NULL,
            `available_date` date NOT NULL,
            `added_date` datetime NOT NULL,
            PRIMARY KEY (`id`)
          ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;
          
          --
          -- Dumping data for table `aproduct`
          --
          
          INSERT INTO `aproduct` (`id`, `account_id`, `name`, `price`, `category`, `available_date`, `added_date`) VALUES
          (1, 1, 'prodcut one', '20', 'category1', '2014-10-02', '2014-10-08 00:00:00'),
          (2, 2, 'product two', '30', 'category2', '2014-10-05', '2014-10-03 00:00:00'),
          (3, 1, 'product three', '30', 'category1', '2014-10-01', '2014-10-23 00:00:00'),
          (4, 3, 'product four', '36', 'category4', '2014-09-03', '2014-10-04 00:00:00'),
          (5, 2, 'product five', '54', 'category2', '2014-10-07', '2014-10-14 00:00:00'),
          (6, 1, 'product six', '66', 'category6', '2014-10-03', '2014-10-06 00:00:00');
          

          非常感谢任何帮助。

0 个答案:

没有答案