【发布时间】:2009-12-10 22:11:59
【问题描述】:
我有 2 个表,定义如下:
CREATE TABLE `product` (
`pid` SMALLINT( 5 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR( 50 ) NOT NULL,
`description` TEXT,
`qty` SMALLINT( 5 ) UNSIGNED NOT NULL DEFAULT '0',
`category` ENUM( '1', '2', '3', '4', '5', '6', '7', '8' ) NOT NULL DEFAULT '1',
`price` DECIMAL( 7, 2 ) UNSIGNED NOT NULL
) ENGINE = InnoDB;
CREATE TABLE `discount` (
`did` SMALLINT( 5 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`pid` SMALLINT( 5 ) UNSIGNED NOT NULL,
`sDate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`eDate` DATETIME NOT NULL,
`dPrice` DECIMAL( 7, 2 ) UNSIGNED NOT NULL,
FOREIGN KEY ( `pid` ) REFERENCES `product`(`pid`)
ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE = InnoDB;
如果有带有sDate < NOW() 和eDate > NOW() 的折扣条目,我正在尝试为每个产品和NULL dPrice 或dPrice 获得正好1 行的结果。
我试过了:
select p.pid, name, price, dPrice, qty
from product p left join discount d
on p.pid = d.pid
where d.sDate<now() and d.eDate>now();
这样做的问题是它只返回具有有效折扣的产品。不显示没有折扣或过期/未来折扣的产品。
接下来我尝试了:
select p.pid, name, price, dPrice, qty
from product p left join discount d
on p.pid = d.pid
where (d.sDate<now() and d.eDate>now()) or dPrice is null;
这离我想要的结果更近了 1 步,它列出了具有有效折扣的产品和没有折扣的产品,但我仍然缺少定义了过期/未来折扣的产品。
在任何时候检查是否只有 1 个折扣有效是在 PHP 中完成的,不需要包含在此语句中。非常感谢任何帮助!
【问题讨论】:
-
什么数据库系统?什么版本??
标签: sql mysql select join left-join