Mysql 如何编写查询以获取特价(如果可用)

Mysql 如何编写查询以获取特价(如果可用),mysql,mysqli,Mysql,Mysqli,我的表格结构如下: -- 1 price type. CREATE TABLE IF NOT EXISTS `price_type` ( `id` int(11) NOT NULL AUTO_INCREMENT, `type` varchar(50) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ; INSERT INTO `pri

我的表格结构如下:

-- 1 price type.

   CREATE TABLE IF NOT EXISTS `price_type` (
     `id` int(11) NOT NULL AUTO_INCREMENT,
    `type` varchar(50) NOT NULL,
    PRIMARY KEY (`id`)
  ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

INSERT INTO `price_type` (`id`, `type`) VALUES
(1, 'Normal price'),
(2, 'Special price');

-- 2 Products

CREATE TABLE IF NOT EXISTS `product` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

INSERT INTO `product` (`id`, `name`) VALUES
(1, 'Tshirt'),
(2, 'Shirt'),
(3, 'Pants'),
(4, 'Pull over');

-- 3 Product price

CREATE TABLE IF NOT EXISTS `product_price` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `product_id` int(11) NOT NULL,
  `price_type_id` int(11) NOT NULL,
  `price` float NOT NULL,
  `start_date` date NOT NULL,
  `end_date` date NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

INSERT INTO `product_price` (`id`, `product_id`, `price_type_id`, `price`, `start_date`, `end_date`) VALUES
(1, 1, 1, 300, '0000-00-00', '0000-00-00'),
(2, 2, 1, 500, '0000-00-00', '0000-00-00'),
(3, 3, 1, 400, '0000-00-00', '0000-00-00'),
(4, 3, 2, 150, '2015-08-01', '2015-11-02'),
(5, 4, 1, 600, '0000-00-00', '0000-00-00');
预期结果(特殊时期):

产品(产品)价格存储在具有不同价格类型(价格类型)ID的不同表(产品价格)中

在这种情况下,产品裤子在2015-08-01和2015-11-02之间有150.00的特价。所以它应该显示特殊价格,而不是正常价格400.00


如何为其编写查询?

您可以加入价格表两次,一次获取正常价格,一次(左键)获取特殊价格(如果有今天有效的价格)

在字段列表中,您可以使用
coalesce
获得特价,返回正常价格。通过这种方式,您可以轻松地从查询中返回当前价格,而不管它是哪种类型:

select  p.id as product_id,
        p.name,
        np.price as normal_price,
        sp.price as special_price,
        sp.end_date as special_price_end_date,

        coalesce(sp.price, np.price) as current_price
from  product p
inner join product_price np 
      on np.product_id = p.id
         and np.price_type_id = 1
left  join product_price sp 
      on sp.product_id = p.id
         and sp.price_type_id = 2
         and CURRENT_DATE() between sp.start_date and sp.end_date
比如:

SELECT pp.id, p.name, pp.price, pp.start_date, pp.end_date FROM product_price pp
INNER JOIN product p
ON pp.product_id=p.id
WHERE 
(pp.start_date < '2015-08-01' AND pp.end_date > '2015-08-01')
OR (pp.start_date IS NULL AND pp.end_date IS NULL)
GROUP BY p.name
ORDER BY pp.price_type_id DESC
从产品价格pp中选择pp.id、p.name、pp.price、pp.start\u date、pp.end\u date
内联积
关于pp.product_id=p.id
哪里
(第页开始日期<'2015-08-01'和第页结束日期>'2015-08-01')
或(pp.start\u日期为空,pp.end\u日期为空)
按p.name分组
按pp.价格\类型\ id说明订购

尝试阅读有关联接以及如何使用联接的信息。日期与所需的操作无关。这就像@satya说的一个简单的连接操作。试着读一读,然后告诉我们你尝试了什么,然后用sql更新你的问题。所以这不是家庭工作服务。检查这个问题的答案谢谢你们的回答。我知道基本情况,但这种情况对我来说似乎很困难。很高兴看到不同的人提出不同的问题。Trol,非常感谢!它给出了我所期望的结果。为了提问,我简化了表格结构。我希望它能满足我的实际需要。非常感谢你的重播,这个解决方案能满足我的需要。当我为我的实际问题执行代码时,Golez Trols的解决方案运行良好。