条件:


3个不同的披萨,总价格每个披萨必须至少有一位顾客(A / B / C)喜欢。 A,B,C是固定要求
(A&B&C)必须喜欢3个所选披萨中的至少2个


预期结果:清单(餐厅名称,pizza1,pizza2,pizza3,总成本)

数据库架构:客户(名称,区域),餐厅(名称,区域),比萨饼(比萨),销售(名称,比萨饼,价格),点赞(名称,比萨饼)

卖表

| 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种可能的披萨将是Hawaiian,Pizza3和Pepperoni。

因此,A必须至少喜欢Hawaiian&Pizza3。
B必须至少喜欢Pizza3和Hawaiian,而C必须至少喜欢比萨饼的2/3,即意大利辣香肠和夏威夷。

A&B&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)中的1个喜欢。
(A&B&C)必须喜欢3个披萨中的至少2个


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

最佳答案

我开始研究这个问题,因为您上面有一个PostgreSQL标记。在PostgreSQL中,我将尝试编写一个查询,该查询将sellslikes表联接在一起,然后将它们聚合到数组中,这样就可以将数组嵌套到所有可能的组合中。

我不太了解MySQL sql方言,因此这是一些简单的查询(注意,由于没有任何组合可以满足所有要求,因此我不得不对数据进行一些更改):

select
    s1.rname,
    s1.pizza, s2.pizza, s3.pizza,
    l1.cname, l2.cname, l3.cname,
    (s1.price+s2.price+s3.price)
from Sells as s1
    inner join Sells as s2 on
        s2.rname = s1.rname
    inner join Sells as s3 on
        s3.rname = s2.rname
    left join likes as l1 on
        l1.pizza = s1.pizza and
        l1.cname = 'alice'
    left join likes as l2 on
        l2.pizza = s2.pizza and
        l2.cname = 'bob'
    left join likes as l3 on
        l3.pizza = s3.pizza and
        l3.cname = 'james'
where
    s1.pizza <> s2.pizza and
    s3.pizza <> s2.pizza and
    s3.pizza <> s1.pizza and
    (s1.price+s2.price+s3.price) <= 80 and
    (
        l1.cname is not null and l2.cname is not null or
        l2.cname is not null and l3.cname is not null or
        l3.cname is not null and l1.cname is not null
    )


09-11 09:35