MySQL选择多个列少于一列的位置,除非该列为零

MySQL选择多个列少于一列的位置,除非该列为零,mysql,Mysql,我正在开发一个价格通知应用程序,正在努力解决如何让查询按预期工作的问题 我有4个价格栏。采购价格、当前价格、亚马逊价格、EBAYPRICE 除PURCHASEPRICE外,在许多情况下,这些列可能为0.00(例如零售商与亚马逊和/或易趣之间未找到产品匹配) 如果没有现在需要添加的附加列,此查询似乎可以正常工作。(虽然我不知道这是最好的方法) 不确定我是否完全理解你的要求。此外,我还必须修改您的示例数据,使其具有满足两种不同场景的行 你可以看到DB小提琴 问题是: SELECT if((

我正在开发一个价格通知应用程序,正在努力解决如何让查询按预期工作的问题

我有4个价格栏。采购价格、当前价格、亚马逊价格、EBAYPRICE

除PURCHASEPRICE外,在许多情况下,这些列可能为0.00(例如零售商与亚马逊和/或易趣之间未找到产品匹配)

如果没有现在需要添加的附加列,此查询似乎可以正常工作。(虽然我不知道这是最好的方法)


不确定我是否完全理解你的要求。此外,我还必须修改您的示例数据,使其具有满足两种不同场景的行

你可以看到DB小提琴

问题是:

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
      )
查询1

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;
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
      )
| 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子句中返回所需行的部分,或者修改order by以按测试结果排序。我包含test1和test2主要是为了调试,并查看where子句的哪一部分与返回的每一行相关。

是的,可以在查询中完成,是的,可能有更好的方法。但是如果没有表模式和一些示例数据,就不可能确定。编辑您的问题,并添加表格的模式以及一些示例数据。@Sloachrasher我已根据您的请求进行了编辑。谢谢,谢谢你的帮助。你的问题很接近我想要完成的。让我试着展开一点——这个查询创建test1/test2列,然后我可以在PHP中对其进行过滤,但我可以首先对NOTIFIEDPRICE列进行过滤。在这个查询中是否有这样做的方法?这正在扩展我的能力/经验。另一件事是,它似乎没有完全正确地得到它。我将编辑我的问题以更改数据,并解释响应中应包括/排除哪些行,以帮助澄清。非常感谢。看看我最新的答案。DBfiddle代码似乎消失了,所以我用一个指向SQLFiddle示例的链接更新了我的答案,并在我的答案中包含了来自该示例的结果/代码。
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
      )
| 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 |