Mysql 优先级查询如何工作(如果满足条件,则一个值优先于另一个值)
Mysql 优先级查询如何工作(如果满足条件,则一个值优先于另一个值),mysql,sql,Mysql,Sql,CREATE TABLE Purchasing ( Campaign VARCHAR(255), Event_Type VARCHAR(255), Quantity_Offer VARCHAR(255), Quantity_Order VARCHAR(255), Quantity_Received VARCHAR(255), Quantity_Stored VARCHAR(255) ); INSERT INTO Purchasing (Campa
CREATE TABLE Purchasing (
Campaign VARCHAR(255),
Event_Type VARCHAR(255),
Quantity_Offer VARCHAR(255),
Quantity_Order VARCHAR(255),
Quantity_Received VARCHAR(255),
Quantity_Stored VARCHAR(255)
);
INSERT INTO Purchasing
(Campaign, Event_Type, Quantity_Offer, Quantity_Order, Quantity_Received, Quantity_Stored)
VALUES
("C001", "Offered", "300", NULL, NULL, NULL),
("C001", "Ordered", NULL, "350", NULL, NULL),
("C001", "Received", NULL, NULL, "348", NULL),
("C001", "Stored", NULL, NULL, NULL, "345"),
("C002", "Offered", "800", NULL, NULL, NULL),
("C002", "Ordered", NULL, "720", NULL, NULL),
("C002", "Received", NULL, NULL, "730", NULL),
("C002", "Stored", NULL, NULL, NULL, "735"),
("C003", "Offered", "600", NULL, NULL, NULL),
("C003", "Ordered", NULL, "400", NULL, NULL),
("C003", "Received", NULL, NULL, "410", NULL),
("C004", "Offered", "150", NULL, NULL, NULL),
("C004", "Ordered", NULL, "200", NULL, NULL),
("C005", "Offered", "430", NULL, NULL, NULL),
("C005", "Ordered", NULL, "440", NULL, NULL),
("C006", "Offered", "520", NULL, NULL, NULL),
("C006", "Ordered", NULL, "670", NULL, NULL),
("C007", "Offered", "330", NULL, NULL, NULL),
("C008", "Offered", "780", NULL, NULL, NULL);
该表使用事件类型
显示不同的活动及其在采购流程中的状态
流程如下所示:
Stored > Received > Ordered > Offered
基于此结构,结果应如下所示:
Campaign Event_Type Quantity
C001 Stored 345
C002 Stored 735
C003 Received 410
C004 Ordered 200
C005 Ordered 440
C006 Ordered 670
C007 Offered 330
C008 Offered 780
为了实现这一点,我使用问题中描述的优先级查询:
这个查询正好提供了我需要的结果
但是,我想知道这个查询实际上是如何工作的,因为当我只运行这个部分时:
select p2.event_type
from Purchasing p2
order by field(p2.event_type, 'Stored', 'Received', 'Ordered', 'Offered')
limit 1;
结果是:
event_type
Stored
查询如何知道事件类型
中的哪一个出现在存储的之后?这一行是关键(注释它并检查结果):
您的子查询是。它定位每个活动的实际事件类型。
当您在没有相关条件的情况下单独执行子查询时,它将分析所有采购表
CREATE TABLE Purchasing (
Campaign VARCHAR(255),
Event_Type VARCHAR(255),
Quantity_Offer VARCHAR(255),
Quantity_Order VARCHAR(255),
Quantity_Received VARCHAR(255),
Quantity_Stored VARCHAR(255)
);
INSERT INTO Purchasing
(Campaign, Event_Type, Quantity_Offer, Quantity_Order, Quantity_Received, Quantity_Stored)
VALUES
("C001", "Offered", "300", NULL, NULL, NULL),
("C001", "Ordered", NULL, "350", NULL, NULL),
("C001", "Received", NULL, NULL, "348", NULL),
("C001", "Stored", NULL, NULL, NULL, "345"),
("C002", "Offered", "800", NULL, NULL, NULL),
("C002", "Ordered", NULL, "720", NULL, NULL),
("C002", "Received", NULL, NULL, "730", NULL),
("C002", "Stored", NULL, NULL, NULL, "735"),
("C003", "Offered", "600", NULL, NULL, NULL),
("C003", "Ordered", NULL, "400", NULL, NULL),
("C003", "Received", NULL, NULL, "410", NULL),
("C004", "Offered", "150", NULL, NULL, NULL),
("C004", "Ordered", NULL, "200", NULL, NULL),
("C005", "Offered", "430", NULL, NULL, NULL),
("C005", "Ordered", NULL, "440", NULL, NULL),
("C006", "Offered", "520", NULL, NULL, NULL),
("C006", "Ordered", NULL, "670", NULL, NULL),
("C007", "Offered", "330", NULL, NULL, NULL),
("C008", "Offered", "780", NULL, NULL, NULL);
步骤1:
相关子查询
——在本例中为,其中p2.campaign=p.campaign
——遍历所有活动
,并识别每个活动的所有可用事件类型
基本上,每个活动都会重新执行内部查询
SELECT
p2.event_type
FROM Purchasing p2
WHERE Campaign ="C003";
第二步:
之后,每个活动的所有可用结果都由定义的
字段
函数中的事件类型
的层次结构
SELECT p2.event_type,
field(event_type, 'Stored', 'Received', 'Ordered', 'Offered') as Position_in_Field
FROM Purchasing p2
ORDER BY 2;
第三步:
最后,LIMIT 1
只保留最高可用的事件类型
因此,外部查询的WHERE
子句获取
每个活动的最高事件类型
SELECT
p2.event_type
FROM Purchasing p2
WHERE Campaign ="C003"
ORDER BY field(p2.event_type, 'Stored', 'Received', 'Ordered', 'Offered')
LIMIT 1;
查看此的输出,从采购中选择事件类型,字段(事件类型,'Stored','Received','Ordered','provided'),并确保您知道coalesce
的功能。。。。
SELECT
p2.event_type
FROM Purchasing p2
WHERE Campaign ="C003"
ORDER BY field(p2.event_type, 'Stored', 'Received', 'Ordered', 'Offered')
LIMIT 1;