Mysql 结果集的子查询或条件逻辑

Mysql 结果集的子查询或条件逻辑,mysql,subquery,conditional,Mysql,Subquery,Conditional,以模拟桌子为例 ORDERS OrderID CustID date 10 1 2014-01-01 11 3 2014-02-01 12 2 2014-03-01 CUSTOMER CustID FName LName 1 Jon Doe 2 Jane Doe 3

以模拟桌子为例

ORDERS                          
OrderID CustID date              
10       1     2014-01-01       
11       3     2014-02-01       
12       2     2014-03-01        

CUSTOMER 
CustID FName LName
1      Jon   Doe         
2      Jane  Doe
3      Mike  Brown

LINEITEM                        
OrderID ProdID                  
10      1                        
10      3                       
11      2                       
12      1
12      2

PRODUCTS
ProdID Description 
1      Apple
2      Orange
3      Grape
我想返回一个如下所示的结果集:

OrderID CustomerLastName Apple Orange Grape
11      Brown            No    Yes    No
12      Doe              Yes   Yes    No
逻辑:选择orderID、客户姓氏,确定他们是否购买了每个产品(是或否) 对于订单日期大于2014-01-01的所有订单

这是我能到的最远的地方了

select O.OrderID as 'OrderID', 
       C.LName as 'CustomerLastName', 
      (some conditional or subquery for figuring out yes or no) as 'Apple',
      (some conditional or subquery for figuring out yes or no) as 'Orange',
      (some conditional or subquery for figuring out yes or no) as 'Grape'
from ORDERS O join CUSTOMER C using (CustID)
              join LINEITEM using (OrderID)
              join Products P using (ProdID)
where O.date > 2014-01-01;
如果您能为每个订单返回一行,以及产品的是/否逻辑,我们将不胜感激


谢谢

这基本上只是表格的一个轴心。与通常的数据透视唯一不同的是,您只需要一个yes/no,而不是每个数据透视列的行的聚合值

SELECT O.OrderID, C.LName AS CustomerLastName,
        IF(MAX(P.Description = 'Apple'), 'Yes', 'No') AS Apple,
        IF(MAX(P.Description = 'Orange'), 'Yes', 'No') AS Orange,
        IF(MAX(P.Description = 'Grape'), 'Yes', 'No') AS Grape
FROM ORDERS AS O
JOIN CUSTOMER AS C USING (CustID)
JOIN LINEITEM AS L USING (OrderID)
JOIN Products AS P USING (ProdID)
WHERE O.date > '2014-01-01'
GROUP BY O.OrderID, C.CustID

对于我在评论中回避的问题,如果你想玩弄它,我总是会使用MAX(然后是一个条件语句)来“伪造”一个pivot表:)


很抱歉,这些表没有保留原始文本框中的格式。试试看,请不要把表并排放在一起,这会使复制粘贴到sqlfiddle变得很困难。很有趣。。。我总是以相反的方式“伪造”数据透视表,执行
MAX(如果(
我想知道一种方法是否比另一种更好/更快?不确定哪种更好,可能差别不大。是的,听起来像是我应该在某个时候测试的东西:)+1不管怎样!@user3182105你能接受答案吗?非常感谢:)
SELECT 
    O.OrderID, C.LName AS CustomerLastName,
    MAX(CASE WHEN P.Description = 'Apple' THEN 'Yes' ELSE 'No' END) AS Apple,
    MAX(CASE WHEN P.Description = 'Orange')THEN 'Yes' ELSE 'No' END) AS Orange,
    MAX(CASE WHEN P.Description = 'Grape')THEN 'Yes' ELSE 'No' END) AS Grape
FROM ORDERS AS O
JOIN CUSTOMER AS C USING (CustID)
JOIN LINEITEM AS L USING (OrderID)
JOIN Products AS P USING (ProdID)
WHERE O.date > '2014-01-01'
GROUP BY O.OrderID, C.CustID