Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 优先级查询如何工作(如果满足条件,则一个值优先于另一个值)_Mysql_Sql - Fatal编程技术网

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;