【问题标题】:Compare two query results and check if value exist in both of them比较两个查询结果并检查它们是否都存在值
【发布时间】:2020-07-17 08:24:58
【问题描述】:

表格 (DB-Fiddle)

CREATE TABLE sales (
    id int auto_increment primary key,
    product VARCHAR(255),
    sales_date DATE,
    insert_time DATE
);

INSERT INTO sales
(product, sales_date, insert_time
)
VALUES 
("Product A", "2020-04-15", "2020-03-05"),
("Product B", "2020-05-20", "2020-03-05"),
("Product C", "2020-02-11", "2020-03-05"),

("Product A", "2020-04-15", "2020-03-06"),
("Product B", "2020-05-20", "2020-03-06"),
("Product C", "2020-02-11", "2020-03-06"),

("Product A", "2020-04-15", "2020-03-07"),
("Product B", "2020-05-20", "2020-03-07"),
("Product C", "2020-02-11", "2020-03-07");

在上面的表格中,每天都会插入产品销售额并分配给insert_time。


现在我想根据insert_time 检查此查询结果中的产品:

SELECT
product,
sales_date
FROM sales
WHERE insert_time = "2020-03-05";

也出现在这个查询的结果中:

SELECT
product,
sales_date
FROM sales
WHERE insert_time = "2020-03-05"
AND sales_date BETWEEN insert_time AND DATE_ADD(insert_time, INTERVAL 3 MONTH)

最终的结果应该是这样的:

product           sales_date         Check
Product A         2020-04-15         O.K.
Product B         2020-05-20         O.K.
Product C         2020-02-11         Error  (--> Because it only appears in the first query)

如何合并两个查询才能达到预期结果?

【问题讨论】:

  • 试试INTERSECT

标签: mysql sql


【解决方案1】:

您可以使用 CASE 语句解决此问题:

SELECT
product,
sales_date,
    CASE
    WHEN sales_date BETWEEN insert_time AND DATE_ADD(insert_time, INTERVAL 3 MONTH) THEN 'Ok'
    ELSE 'Error' END AS 'Check'
FROM sales
WHERE insert_time = "2020-03-05";

您也可以使用 LEFT JOIN,但这意味着您必须敲击桌子两次:

SELECT all_records.product, all_records.sales_date, ifnull(filtered_records.Check, 'Error') AS `Check`
FROM
(
SELECT
product,
sales_date,
'Ok' AS 'Check'
FROM sales
WHERE insert_time = "2020-03-05"
) all_records
LEFT JOIN
(
SELECT
product,
sales_date,
'OK' AS 'Check'
FROM sales
WHERE insert_time = "2020-03-05"
AND sales_date BETWEEN insert_time AND DATE_ADD(insert_time, INTERVAL 3 MONTH)
) filtered_records
 ON all_records.product = filtered_records.product
 AND all_records.sales_date = filtered_records.sales_date

【讨论】:

    【解决方案2】:

    想到一个带有EXISTS 的CASE 表达式:

    SELECT s.product, s.sales_date,
           (CASE WHEN EXISTS (SELECT 1
                              FROM sales s2
                              WHERE s2.product = s.product AND
                                    s2.sales_date BETWEEN s2.insert_time AND DATE_ADD(s2.insert_time, INTERVAL 3 MONTH)
                             )
                 THEN 'OK' ELSE 'ERROR'
            END) as flag
    FROM sales s
    WHERE s.insert_time = '2020-03-05';
    

    请注意,check 是一个错误的列名称,因为它是一个 SQL 关键字(用于 check 约束)。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    • 2022-11-12
    • 2019-01-16
    相关资源
    最近更新 更多