能不能看看这MySQL的er图?

我感觉我弄错了,这关系。看的是挺顺的。但怎么多表连接。可以将顾客的顾客编号放入订单进行联系。但是这菜单怎么进行多表连接?怎么放都不对。我逻辑思维不太好。帮帮忙。谢谢了。

img

img

菜谱.菜品编号 是 订单表 的外键,即订单里面的菜,都是菜谱里有的。顾客.编号 也是 订单表 外键,顾客和订单是多对多关系。顾客只是在点菜时看看菜谱,点完菜就不用了,不需要在系统里建立关系,顾客不需要菜谱也可以点菜,给服务员说出菜名就行,尤其是常客

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/197452
  • 这篇博客你也可以参考下:单台 MySQL 支撑不了这么多的并发请求,我们该怎么办?
  • 除此之外, 这篇博客: 数据库课程设计之工程薪资基本项目管理(基于mysql命令行)中的 1)ER图转为关系表 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    根据ER图先将其转化为几个基本的关系表,转换原则

    • 1:n 1端的候选码属性必须放入n端扩充
    • m:n 两端的候选码都要加入到派生表中

    得到如下四个表

    其中职位名和部门编号为外键, 酬金表是职工和工程的派生表

    工程(工程号,工程名,工程所在地,工程开始时间,工程结束时间)

    职工(职工号,职工姓名, 职位名, 部门编号

    职位 (职位名, 小时工薪率)

    酬金(工程号,职工号,工时)

    部门(部门编号,部门名称)

  • 您还可以看一下 陈贺群老师的软件测试教程系列之MySQL数据库教学视频(中)课程中的 数据库_约束-所有约束在定义表的时候添加方式介绍小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    针对问题,需要进行多表连接,可以使用SQL语句中的JOIN关键字来连接多个表。JOIN关键字本身是一个非常广泛的话题,下面简要介绍一下。

    首先,要知道MySQL中JOIN关键字有四种类型:

    1. INNER JOIN(内连接): 使用INNER JOIN关键字可以获得在左边和右边表中都匹配的行。

    示例语句:SELECT * FROM 表1 INNER JOIN 表2 ON 表1.某列 = 表2.某列;

    1. LEFT JOIN(左连接): 使用LEFT JOIN关键字可以获得在左边表中都存在的行,而右边表中不存在的行会被赋予NULL值。

    示例语句:SELECT * FROM 表1 LEFT JOIN 表2 ON 表1.某列 = 表2.某列;

    1. RIGHT JOIN(右连接): 同理,使用RIGHT JOIN关键字可以获得在右边表中都存在的行,而左边表中不存在的行会被赋予NULL值。

    示例语句:SELECT * FROM 表1 RIGHT JOIN 表2 ON 表1.某列 = 表2.某列;

    1. FULL OUTER JOIN(全外连接): 使用FULL OUTER JOIN关键字可以获得在两个表中都存在的行,以及在其中一个表中存在而在另一个表中不存在的行,而不存在的行会被赋予NULL值。

    示例语句:SELECT * FROM 表1 FULL OUTER JOIN 表2 ON 表1.某列 = 表2.某列;

    下面以INNER JOIN为例,尝试解决问题。

    假设有三个表:customer, order, order_detail,其中customer表有一个字段customer_id表示顾客编号,order表有字段order_id表示订单编号,order_detail表有字段order_id表示订单编号,也有一个字段customer_id表示该顾客编号。现在需要将customer表中的customer_id字段与order_detail和order表中的customer_id字段连接起来,得到相关信息。

    步骤如下:

    1. 使用INNER JOIN关键字连接customer表和order_detail表:

    sql SELECT * FROM customer INNER JOIN order_detail ON customer.customer_id = order_detail.customer_id;

    这句话的意思是:找到customer表和order_detail表中在customer_id字段上相互匹配的行。这样的结果会包含两个表中customer_id两列中所有匹配的行。其中如果表customer中的某个customer_id值在order_detail表中没有对应的值,则不会被列出。同理,如果order_detail中的customer_id字段中的某个值,在customer表中没有对应的值,则也不会被列出。

    1. 将得到的结果再次与order表连接起来,即可得到最终的结果:

    sql SELECT * FROM customer INNER JOIN order_detail ON customer.customer_id = order_detail.customer_id INNER JOIN order ON order_detail.order_id = order.order_id;

    这条SQL语句中,内部的INNER JOIN关键字将customer表和order_detail表连接起来,产生了一张中间表格。这张表格中会包含两边中在customer_id字段上相互匹配的行。随后与这张表格再次进行INNER JOIN,连接order_detail和order两张表格,将结果进一步筛选,只保留两边都存在的订单信息。最终结果会包含customer表中的所有行,同时包含order_detail和order表格中匹配的行。如果在order_detail表中的某个order_id值,在order表中没有对应的值,则这个order_id列的值会是null。

    附注:

    以上的SQL语句只是示例,实际应用情况中需要根据具体的表结构和字段名进行相应的修改。在某些情况下,使用多表JOIN会使查询变得较慢,因此需要注意表的大小和查询的复杂度。如果出现问题(如死锁等),需要进行相应的分析和优化,可以结合以上参考资料中的内容进行分析和修改。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^