选择满足SQL

时间:2018-02-24 11:25:24

标签: mysql sql

条件:

  1. 3种不同的比萨饼,总价格<= $ 80,

  2. 每位披萨必须至少有一位顾客(A / B / C)喜欢。 A,B,C是固定要求

  3. (A&amp; B&amp; C)必须喜欢3种精选披萨中的至少2种

  4. 预期结果列出(餐馆名称,pizza1,pizza2,pizza3,总费用)

    数据库架构:客户(cname,区域),餐馆(rname,区域),比萨饼(披萨),卖(rname,披萨,价格),喜欢(cname,披萨)

    卖表

    | rname  | Pizzas    | Price |
    ------------------------------
    | rname1 | Hawaiian  | $10   |
    | rname2 | Pepperoni | $20   |
    | rname2 | Pizza3    | $20   |
    | rname3 | Pizza4    | $20   |
    

    喜欢表格

    | cname  | Pizzas   
    ----------------------
    | A      | Hawaiian  |
    | A      | Pizza3    |
    | A      | Pepperoni | 
    | B      | Pizza3    | 
    | B      | Hawaiian  |
    | C      | Hawaiian  |
    | D      | Pizza4    | 
    

    3种可能的比萨饼是夏威夷,比萨3和意大利辣香肠。

    所以A必须至少喜欢夏威夷和夏威夷Pizza3。 B必须至少喜欢Pizza3&amp;夏威夷,而C必须喜欢至少2/3的意大利辣香肠和夏威夷比萨饼。

    A&amp; B&amp; C不一定喜欢同样的披萨。 但每个披萨必须至少有一位顾客。

    SQL查询:

    SELECT s1.rname, s1.pizza, s2.pizza, s3.pizza, (s1.price+s2.price+s3.price)
    FROM Sells s1 join
         Sells s2 join
         Sells s3
    ON   s1.rname = s2.rname = s3. rname 
    AND  s1.price < s2.price < s3.price 
    WHERE s1.pizza < s2.pizza < s3.pizza 
    

    问题:我仍然需要在查询中添加likes表以检查

    • 每张披萨必须至少有一张(A / B / C)。

    • (A&amp; B&amp; C)必须喜欢3个披萨中的至少2个

    数据库架构参考:http://sqlfiddle.com/#!9/dceae9/1

1 个答案:

答案 0 :(得分:0)

我开始查看问题因为你有一个postgresql标签。在PostgreSQL中,我尝试编写一个连接select DW.day, ifnull(t.my_count,0) taly from daysoffthemonth DW left join ( select DAYOFMONTH( stats.timestamp ) day , COUNT(*) my_count from stats where MONTH( stats.timestamp ) = MONTH(CURDATE()) AND YEAR( stats.timestamp )= YEAR(CURDATE()) group by DAYOFMONTH( stats.timestamp ) ) t on DW.day = t.day sells表的查询,然后将它们聚合到数组中,这样就可以将数组排除在所有可能的组合之外。

我不太了解MySQL sql方言,所以这里有一些简单的查询(请注意我不得不稍微改变你的数据,因为你没有任何组合满足所有要求):

likes

sql fiddle example