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
然而,这可能不是非常有效.为了获得更好的性能,我会为条件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
这是第三种方法,与第二种方法完全相同,但使用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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。