MySQL SELECT WHERE许多列小于一列,除非该列为零

时间:2018-06-21 22:49:19

标签: mysql

我正在开发一个价格通知应用程序,并在如何使查询按需工作方面苦苦挣扎。

我有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编号或不检索:

  • 未检索到247868、539189和3745320,因为通知的价格低于所有其他价格,因此 之前已通知用户,但未通知他们的价格 尚未被击败。
  • 为3748482检索,因为eBay价格低于购买价格和 通知价格,因此即使价格下降时通知用户 到22岁,仍然比收到通知时少,因此我们希望 再次通知他们价格进一步下跌。
  • 由于当前价格小于购买价格而检索到5294842,并且 通知价格0表示尚未通知用户
  • 已检索5472824,因为亚马逊价格低于购买价格。 通知价格为0表示尚未通知用户。
  • 检索到13553953,因为eBay价格低于购买价格,并且 通知价格0表示尚未通知用户

希望这有助于澄清我要完成的工作。

--
-- 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;

1 个答案:

答案 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
      )

编辑

SQL Fiddle

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子句的哪一部分与返回的每一行有关。