ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

mysql – 在同一区域中找到至少2个客户,他们至少喜欢在SQL中销售的一个披萨

2019-06-27 13:02:33  阅读:149  来源: 互联网

标签:mysql sql


SQL查询中的表

>喜欢(cname,披萨)
>客户(cname,地区)
>餐馆(rname,地区)
>出售(rname,披萨,价格)

请参阅:sqlfiddle.com/#!9/5be81e/1(包含代码和数据库模式)

预期结果:符合以下条件的餐馆列表

条件:

>至少有2位顾客喜欢餐厅出售的至少一个披萨.
(他们不一定喜欢餐厅出售的相同披萨,顾客和餐厅不必在同一区域)
>餐厅必须至少卖3个比萨饼
>至少有一家餐馆出售的比萨饼必须比20美元便宜

我的SQL代码:

SELECT r.rname
FROM restaurants r
WHERE EXISTS(SELECT 1
         FROM sells s 
         INNER JOIN likes l ON l.pizza = s.pizza
         GROUP BY c.area
         HAVING COUNT(l.pizza) >= 2
         WHERE s.rname = r.rname 
         AND s.pizza >=3 
         AND s.price <20
         )

我将此代码合并到其他几个SQL帖子中,这些帖子促进了WHERE EXIST的使用.现在我陷入了条件1最难的部分.

更新:所有答案都非常好.结果是客户和餐厅不必在同一区域

解决方法:

没有任何子查询,但有一个巨大的连接:

SELECT r.rname
FROM restaurants r
JOIN sells s ON s.rname = r.rname
LEFT JOIN likes l on l.pizza = s.pizza
LEFT JOIN customers c
  ON  c.area  = r.area
  AND c.cname = l.cname
GROUP BY r.rname
HAVING 1
   AND COUNT(DISTINCT c.cname) >= 2 -- cond. 1
   AND COUNT(DISTINCT s.pizza) >= 3 -- cond. 2
   AND MIN(s.price) < 20            -- cond. 3
ORDER BY r.rname

Demo

然而,这可能不是非常有效.为了获得更好的性能,我会为条件1编写一个查询,为条件2和3编写一个查询.然后加入它们:

SELECT *
FROM (
    SELECT r.rname
    FROM restaurants r
    JOIN sells s ON s.rname = r.rname
    JOIN likes l on l.pizza = s.pizza
    JOIN customers c
      ON  c.area  = r.area
      AND c.cname = l.cname
    GROUP BY r.rname
    HAVING COUNT(DISTINCT c.cname) >= 2
) t1
NATURAL JOIN (
    SELECT s.rname
    FROM sells s
    GROUP BY s.rname
    HAVING MIN(s.price) < 20 
       AND COUNT(*) >= 3
) t2

Demo

这是第三种方法,与第二种方法完全相同,但使用EXISTS子查询而不是JOIN.

SELECT r.rname
FROM restaurants r
JOIN sells s ON s.rname = r.rname
JOIN likes l on l.pizza = s.pizza
JOIN customers c
  ON  c.area  = r.area
  AND c.cname = l.cname
GROUP BY r.rname
HAVING COUNT(DISTINCT c.cname) >= 2
   AND EXISTS (
     SELECT s.rname
     FROM sells s
     WHERE s.rname = r.rname
     HAVING MIN(s.price) < 20 
        AND COUNT(*) >= 3
)

如果喜欢披萨的顾客不需要与餐厅在同一区域,您只需要删除条件c.area = r.area.而且你也不需要触摸桌子上的餐馆和顾客.因此查询会变短:

SELECT s.rname
FROM sells s
LEFT JOIN likes l on l.pizza = s.pizza
GROUP BY s.rname
HAVING COUNT(DISTINCT l.cname) >= 2
   AND COUNT(DISTINCT s.pizza) >= 3
   AND MIN(s.price) < 20

标签:mysql,sql
来源: https://codeday.me/bug/20190627/1304865.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有