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