首页 > 解决方案 > 如何查询价格和数量组合小于另一个的产品

问题描述

我有这个示例服务表,我在其中维护了我作为产品销售的按摩服务的记录。

||ID||Duration||Price||
|1  |100      |10.0|
|2  |200      |20.0|
|3  |300      |30.0|
|4  |400      |25.0|
|5  |500      |50.0|

加班,我添加比现有产品更具竞争力的新产品(价格和持续时间的组合)以吸引更多客户。我想查找过时的记录。当您需要付出更多而获得更少时,它被认为是过时的。在上面的示例中,ID 为 3 的记录已过时。

我如何编写查询来实现这一点?

标签: mysql

解决方案


过时的按摩是一种价格高于任何持续时间更长的按摩的按摩

可以使用这种查询来检索过时的按摩:

SELECT m1.*
FROM massages m1
JOIN massages m2
ON m1.Price > m2.Price
AND m1.Duration <= m2.Duration

然后,此查询可用于在查询中查找要删除的按摩DELETE

架构(MySQL v5.7)

CREATE TABLE massages (
  `ID` INTEGER,
  `Duration` INTEGER,
  `Price` INTEGER
);

INSERT INTO massages
  (`ID`, `Duration`, `Price`)
VALUES
  (1, 100, 10.0),
  (2, 200, 20.0),
  (3, 300, 30.0),
  (4, 400, 25.0),
  (5, 500, 50.0);

-- -------------------------- This is what you are looking for --------------------------
DELETE FROM massages
WHERE massages.ID IN
(
    SELECT id FROM
    (
      SELECT m1.ID AS id
      FROM massages m1
      JOIN massages m2
      ON m1.Price > m2.Price
      AND m1.Duration <= m2.Duration
    ) AS IdsToDelete
);
-- --------------------------------------------------------------------------------------

查询 #1

SELECT * FROM massages;

输出

| ID  | Duration | Price |
| --- | -------- | ----- |
| 1   | 100      | 10    |
| 2   | 200      | 20    |
| 4   | 400      | 25    |
| 5   | 500      | 50    |

在 DB Fiddle 上查看


推荐阅读