我正在开发一个价格通知应用程序,并在如何使查询按需工作方面苦苦挣扎。
我有4个价格栏。采购价格,当前价格,亚马逊价格,易买价
在许多情况下,除了PURCHASEPRICE以外,这些列可能为0.00(例如,在零售商与Amazon和/或eBay之间找不到产品匹配项)
此查询似乎可以正常运行,而无需立即添加其他列。 (尽管我不知道这是最好的方法)
SELECT *
FROM `orders`
WHERE (CURRENTPRICE < PURCHASEPRICE AND CURRENTPRICE > 0)
OR (AMAZONPRICE < PURCHASEPRICE AND AMAZONPRICE > 0)
OR (EBAYPRICE < PURCHASEPRICE AND EBAYPRICE > 0)
AND OVER30DAYS != '1'
但是,当通知用户价格发生变化时,我需要在价格的另一列中工作,例如NOTIFIEDPRICE,并且仅当NOTIFIEDPRICE大于PURCHASEPRICE,AMAZONPRICE或EBAYPRICE且NOTIFIEDPRICE不是=时才检索结果。 0。
在查询中有没有办法做到这一点?还是更好的方法?
谢谢!
根据要求进行了添加结构和示例数据的编辑。
由于这些情况,对于示例数据中的行,应检索以下SKU编号或不检索:
希望这有助于澄清我要完成的工作。
--
-- Table structure for table `orders`
--
CREATE TABLE `orders` (
`ORDERNUMBER` int(11) NOT NULL,
`EMAIL` text COLLATE utf8mb4_unicode_ci NOT NULL,
`CUSTOMERNAME` text COLLATE utf8mb4_unicode_ci NOT NULL,
`ORDERDATE` date NOT NULL,
`SKU` int(11) NOT NULL,
`UPC` varchar(25) COLLATE utf8mb4_unicode_ci NOT NULL,
`MANUFACTURER` text COLLATE utf8mb4_unicode_ci NOT NULL,
`MANUFACTURERID` text COLLATE utf8mb4_unicode_ci NOT NULL,
`NAME` text COLLATE utf8mb4_unicode_ci NOT NULL,
`PURCHASEPRICE` decimal(15,2) NOT NULL,
`CURRENTPRICE` decimal(15,2) DEFAULT NULL,
`AMAZONPRICE` decimal(15,2) DEFAULT NULL,
`EBAYPRICE` decimal(15,2) DEFAULT NULL,
`NOTIFIEDPRICE` decimal(15,2) DEFAULT NULL,
`QUANTITY` smallint(3) NOT NULL,
`OVER30DAYS` tinyint(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Dumping data for table `orders`
--
INSERT INTO `orders` (`ORDERNUMBER`, `EMAIL`, `CUSTOMERNAME`, `ORDERDATE`, `SKU`, `UPC`, `MANUFACTURER`, `MANUFACTURERID`, `NAME`, `PURCHASEPRICE`, `CURRENTPRICE`, `AMAZONPRICE`, `EBAYPRICE`, `NOTIFIEDPRICE`, `QUANTITY`, `OVER30DAYS`) VALUES
(17104115, 'user@user.com', 'User Name', '2018-05-27', 247868, '764017000018', 'New World Marine', 'FX-8', 'New World Marine Fendergrip Fender Adjuster', '15.99', '12.99', '0.00', '0.00', '11.00', 0, 0),
(17104115, 'user@user.com', 'User Name', '2018-05-27', 539189, '071247859324', 'Star Brite', '085932PW', 'Star Brite Nonskid Deck Cleaner with PTEF, Quart', '11.39', '18.99', '7.00', '0.00', '6.00', 0, 0),
(17104115, 'user@user.com', 'User Name', '2018-05-27', 3733482, '632085050252', 'Blue Sea Systems', '5025', 'Blue Sea Systems 6-Circuit Fuse Block with Ground Bus and Cover', '38.39', '47.99', '0.00', '21.00', '22.00', 0, 0),
(17104115, 'user@user.com', 'User Name', '2018-05-27', 3745320, '810062001163', 'Woody Wax', 'WW16', 'Woody Wax Fiberglass & Nonskid Deck Wax', '39.99', '39.99', '0.00', '38.00', '37.00', 0, 0),
(17104115, 'user@user.com', 'User Name', '2018-05-27', 5292842, '788026089949', 'Standard Horizon', 'MMB-84', 'Standard Horizon Flush Mount Kit for VHF Radios', '16.99', '14.99', '0.00', '0.00', '0.00', 0, 0),
(17104115, 'user@user.com', 'User Name', '2018-05-27', 5472824, '810062005000', 'Woody Wax', 'WSH32', 'Woody Wax Ultra Pine Wash & Wax Boat Soap', '24.99', '24.99', '22.00', '0.00', '0.00', 0, 0),
(17104115, 'user@user.com', 'User Name', '2018-05-27', 13553953, '858693003019', 'Stern Saver', 'SS01-BW', 'Stern Saver Transducer Mounting Block', '49.99', '49.99', '0.00', '30.00', '0.00', 0, 0);
--
-- Indexes for dumped tables
--
--
-- Indexes for table `orders`
--
ALTER TABLE `orders`
ADD UNIQUE KEY `ORDERNUMBER` (`ORDERNUMBER`,`SKU`);
COMMIT;
答案 0 :(得分:0)
不确定我是否完全了解您的要求。另外,我不得不修改您的示例数据,使其具有满足两种不同情况的行。
您可以看到DB Fiddle here
以下是查询:
SELECT
if((CURRENTPRICE < PURCHASEPRICE AND CURRENTPRICE > 0)
OR (AMAZONPRICE < PURCHASEPRICE AND AMAZONPRICE > 0)
OR (EBAYPRICE < PURCHASEPRICE AND EBAYPRICE > 0) AND OVER30DAYS != '1',1,0) as `test1`,
if(((NOTIFIEDPRICE > PURCHASEPRICE AND PURCHASEPRICE != 0) OR
(NOTIFIEDPRICE > AMAZONPRICE AND AMAZONPRICE != 0) OR
(NOTIFIEDPRICE > EBAYPRICE AND EBAYPRICE != 0)) AND
NOTIFIEDPRICE != 0,1,0) as `test2`,
`orders`.*
FROM `orders`
WHERE ((CURRENTPRICE < PURCHASEPRICE AND CURRENTPRICE > 0)
OR (AMAZONPRICE < PURCHASEPRICE AND AMAZONPRICE > 0)
OR (EBAYPRICE < PURCHASEPRICE AND EBAYPRICE > 0)
AND OVER30DAYS != '1')
OR
(
((NOTIFIEDPRICE > PURCHASEPRICE AND PURCHASEPRICE != 0) OR
(NOTIFIEDPRICE > AMAZONPRICE AND AMAZONPRICE != 0) OR
(NOTIFIEDPRICE > EBAYPRICE AND EBAYPRICE != 0)) AND
NOTIFIEDPRICE != 0
)
编辑
MySQL 5.6模式设置:
CREATE TABLE `orders` (
`ORDERNUMBER` int(11) NOT NULL,
`EMAIL` text COLLATE utf8mb4_unicode_ci NOT NULL,
`CUSTOMERNAME` text COLLATE utf8mb4_unicode_ci NOT NULL,
`ORDERDATE` date NOT NULL,
`SKU` int(11) NOT NULL,
`UPC` varchar(25) COLLATE utf8mb4_unicode_ci NOT NULL,
`MANUFACTURER` text COLLATE utf8mb4_unicode_ci NOT NULL,
`MANUFACTURERID` text COLLATE utf8mb4_unicode_ci NOT NULL,
`NAME` text COLLATE utf8mb4_unicode_ci NOT NULL,
`PURCHASEPRICE` decimal(15,2) NOT NULL,
`CURRENTPRICE` decimal(15,2) DEFAULT NULL,
`AMAZONPRICE` decimal(15,2) DEFAULT NULL,
`EBAYPRICE` decimal(15,2) DEFAULT NULL,
`NOTIFIEDPRICE` decimal(15,2) DEFAULT NULL,
`QUANTITY` smallint(3) NOT NULL,
`OVER30DAYS` tinyint(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Dumping data for table `orders`
--
INSERT INTO `orders` (`ORDERNUMBER`, `EMAIL`, `CUSTOMERNAME`, `ORDERDATE`, `SKU`, `UPC`, `MANUFACTURER`, `MANUFACTURERID`, `NAME`, `PURCHASEPRICE`, `CURRENTPRICE`, `AMAZONPRICE`, `EBAYPRICE`, `NOTIFIEDPRICE`, `QUANTITY`, `OVER30DAYS`) VALUES
(17104115, 'user@user.com', 'User Name', '2018-05-27', 247868, '764017000018', 'New World Marine', 'FX-8', 'New World Marine Fendergrip Fender Adjuster', '15.99', '12.99', '0.00', '0.00', '11.00', 0, 0),
(17104115, 'user@user.com', 'User Name', '2018-05-27', 539189, '071247859324', 'Star Brite', '085932PW', 'Star Brite Nonskid Deck Cleaner with PTEF, Quart', '11.39', '18.99', '7.00', '0.00', '6.00', 0, 0),
(17104115, 'user@user.com', 'User Name', '2018-05-27', 3733482, '632085050252', 'Blue Sea Systems', '5025', 'Blue Sea Systems 6-Circuit Fuse Block with Ground Bus and Cover', '38.39', '47.99', '0.00', '21.00', '22.00', 0, 0),
(17104115, 'user@user.com', 'User Name', '2018-05-27', 3745320, '810062001163', 'Woody Wax', 'WW16', 'Woody Wax Fiberglass & Nonskid Deck Wax', '39.99', '39.99', '0.00', '38.00', '37.00', 0, 0),
(17104115, 'user@user.com', 'User Name', '2018-05-27', 5292842, '788026089949', 'Standard Horizon', 'MMB-84', 'Standard Horizon Flush Mount Kit for VHF Radios', '16.99', '14.99', '0.00', '0.00', '0.00', 0, 0),
(17104115, 'user@user.com', 'User Name', '2018-05-27', 5472824, '810062005000', 'Woody Wax', 'WSH32', 'Woody Wax Ultra Pine Wash & Wax Boat Soap', '24.99', '24.99', '22.00', '0.00', '0.00', 0, 0),
(17104115, 'user@user.com', 'User Name', '2018-05-27', 13553953, '858693003019', 'Stern Saver', 'SS01-BW', 'Stern Saver Transducer Mounting Block', '49.99', '49.99', '0.00', '30.00', '0.00', 0, 0);
--
-- Indexes for dumped tables
--
--
-- Indexes for table `orders`
--
ALTER TABLE `orders`
ADD UNIQUE KEY `ORDERNUMBER` (`ORDERNUMBER`,`SKU`);
COMMIT;
查询1 :
SELECT
if((CURRENTPRICE < PURCHASEPRICE AND CURRENTPRICE > 0)
OR (AMAZONPRICE < PURCHASEPRICE AND AMAZONPRICE > 0)
OR (EBAYPRICE < PURCHASEPRICE AND EBAYPRICE > 0) AND NOT OVER30DAYS,1,0) as `test1`,
if(((NOTIFIEDPRICE > PURCHASEPRICE AND PURCHASEPRICE != 0) OR
(NOTIFIEDPRICE > AMAZONPRICE AND AMAZONPRICE != 0) OR
(NOTIFIEDPRICE > EBAYPRICE AND EBAYPRICE != 0)) AND
NOTIFIEDPRICE != 0,1,0) as `test2`,
`orders`.*
FROM `orders`
WHERE ((CURRENTPRICE < PURCHASEPRICE AND CURRENTPRICE > 0)
OR (AMAZONPRICE < PURCHASEPRICE AND AMAZONPRICE > 0)
OR (EBAYPRICE < PURCHASEPRICE AND EBAYPRICE > 0)
AND NOT OVER30DAYS)
OR
(
((NOTIFIEDPRICE > PURCHASEPRICE AND PURCHASEPRICE != 0) OR
(NOTIFIEDPRICE > AMAZONPRICE AND AMAZONPRICE != 0) OR
(NOTIFIEDPRICE > EBAYPRICE AND EBAYPRICE != 0)) AND
NOTIFIEDPRICE != 0
)
Results :
| test1 | test2 | ORDERNUMBER | EMAIL | CUSTOMERNAME | ORDERDATE | SKU | UPC | MANUFACTURER | MANUFACTURERID | NAME | PURCHASEPRICE | CURRENTPRICE | AMAZONPRICE | EBAYPRICE | NOTIFIEDPRICE | QUANTITY | OVER30DAYS |
|-------|-------|-------------|---------------|--------------|------------|----------|--------------|------------------|----------------|-----------------------------------------------------------------|---------------|--------------|-------------|-----------|---------------|----------|------------|
| 1 | 0 | 17104115 | user@user.com | User Name | 2018-05-27 | 247868 | 764017000018 | New World Marine | FX-8 | New World Marine Fendergrip Fender Adjuster | 15.99 | 12.99 | 0 | 0 | 11 | 0 | false |
| 1 | 0 | 17104115 | user@user.com | User Name | 2018-05-27 | 539189 | 071247859324 | Star Brite | 085932PW | Star Brite Nonskid Deck Cleaner with PTEF, Quart | 11.39 | 18.99 | 7 | 0 | 6 | 0 | false |
| 1 | 1 | 17104115 | user@user.com | User Name | 2018-05-27 | 3733482 | 632085050252 | Blue Sea Systems | 5025 | Blue Sea Systems 6-Circuit Fuse Block with Ground Bus and Cover | 38.39 | 47.99 | 0 | 21 | 22 | 0 | false |
| 1 | 0 | 17104115 | user@user.com | User Name | 2018-05-27 | 3745320 | 810062001163 | Woody Wax | WW16 | Woody Wax Fiberglass & Nonskid Deck Wax | 39.99 | 39.99 | 0 | 38 | 37 | 0 | false |
| 1 | 0 | 17104115 | user@user.com | User Name | 2018-05-27 | 5292842 | 788026089949 | Standard Horizon | MMB-84 | Standard Horizon Flush Mount Kit for VHF Radios | 16.99 | 14.99 | 0 | 0 | 0 | 0 | false |
| 1 | 0 | 17104115 | user@user.com | User Name | 2018-05-27 | 5472824 | 810062005000 | Woody Wax | WSH32 | Woody Wax Ultra Pine Wash & Wax Boat Soap | 24.99 | 24.99 | 22 | 0 | 0 | 0 | false |
| 1 | 0 | 17104115 | user@user.com | User Name | 2018-05-27 | 13553953 | 858693003019 | Stern Saver | SS01-BW | Stern Saver Transducer Mounting Block | 49.99 | 49.99 | 0 | 30 | 0 | 0 | false |
我不确定结果中哪些记录不符合您的要求。是的,您可以过滤PHP代码,或仅使用where子句中返回所需行的部分,或修改顺序以按测试结果进行排序。我包括test1和test2主要是为了调试,并查看where子句的哪一部分与返回的每一行有关。