jjzjj

mysql - 在同一地区找到至少 2 位顾客,他们至少喜欢一种用 SQL 出售的比萨饼

coder 2023-10-20 原文

SQL 查询中的表

  1. 喜欢(cname,披萨)

  2. 客户(cname,区域)

  3. 餐厅(名称、区域)

  4. 销量(名称、披萨、价格)

引用:sqlfiddle.com/#!9/5be81e/1(由代码和数据库schema组成)

预期结果:满足以下条件的餐厅列表

条件:

  1. 至少有 2 位顾客喜欢餐厅出售的至少一种披萨。 (他们不一定喜欢餐厅卖的同款披萨,顾客和餐厅不一定在同一个区域)

  2. 餐厅必须销售至少 3 个比萨饼

  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
         )

我根据其他几篇促进使用 WHERE EXIST 的 SQL 帖子合并了这段代码。现在我陷入了条件 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。而且您也不需要触摸表 restaurantscustomers。所以查询会变得更短:

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 - 在同一地区找到至少 2 位顾客,他们至少喜欢一种用 SQL 出售的比萨饼,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48971012/

有关mysql - 在同一地区找到至少 2 位顾客,他们至少喜欢一种用 SQL 出售的比萨饼的更多相关文章

  1. ruby - Highline 询问方法不会使用同一行 - 2

    设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案

  2. ruby - Rails 关联 - 同一个类的多个 has_one 关系 - 2

    我的问题的一个例子是体育游戏。一场体育比赛有两支球队,一支主队和一支客队。我的事件记录模型如下:classTeam"Team"has_one:away_team,:class_name=>"Team"end我希望能够通过游戏访问一个团队,例如:Game.find(1).home_team但我收到一个单元化常量错误:Game::team。谁能告诉我我做错了什么?谢谢, 最佳答案 如果Gamehas_one:team那么Rails假设您的teams表有一个game_id列。不过,您想要的是games表有一个team_id列,在这种情况下

  3. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  4. Hive SQL 五大经典面试题 - 2

    目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类

  5. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  6. ruby-on-rails - 有没有一种工具可以在编码时自动保存对文件的增量更改? - 2

    我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功

  7. jquery - 如何将 AJAX 变量从 jQuery 传递到他们的 Controller ? - 2

    我有一个电子邮件表格。但是我正在制作一个测试电子邮件表单,用户可以在其中添加一个唯一的电子邮件,并让电子邮件测试将其发送到该特定电子邮件。为了简单起见,我决定让测试电子邮件通过ajax执行,并将整个内容粘贴到另一个电子邮件表单中。我不知道如何将变量从我的HAML发送到我的Controllernew.html.haml-form_tagadmin_email_blast_pathdoSubject%br=text_field_tag'subject',:class=>"mass_email_subject"%brBody%br=text_area_tag'message','',:nam

  8. ruby-on-rails - Rails 单选按钮 - 模型中多列的一种选择 - 2

    我希望用户从一个模型的三个选项中选择一个。即我有一个模型视频,可以被评为正面/负面/未知目前我有三列bool值(pos/neg/unknown)。这是处理这种情况的最佳方式吗?为此,表单应该是什么样的?目前我有类似的东西但显然它允许多项选择,而我试图将它限制为只有一个..怎么办? 最佳答案 如果要使用字符串列,让我们说rating。然后在你的表单中:#...#...它只允许一个选择编辑完全相同但使用radio_button_tag: 关于ruby-on-rails-Rails单选按钮-模

  9. ruby - 在 Ruby 中是否有一种惯用的方法来操作 2 个数组? - 2

    a=[3,4,7,8,3]b=[5,3,6,8,3]假设数组长度相同,是否有办法使用each或其他一些惯用方法从两个数组的每个元素中获取结果?不使用计数器?例如获取每个元素的乘积:[15,12,42,64,9](0..a.count-1).eachdo|i|太丑了...ruby1.9.3 最佳答案 使用Array.zip怎么样?:>>a=[3,4,7,8,3]=>[3,4,7,8,3]>>b=[5,3,6,8,3]=>[5,3,6,8,3]>>c=[]=>[]>>a.zip(b)do|i,j|c[[3,5],[4,3],[7,6],

  10. ruby-on-rails - 无法安装 mysql2 0.3.14 gem - 2

    我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby​​目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin

随机推荐