【问题标题】:How to SELECT data from 5 different tables in MySQL如何从 MySQL 中的 5 个不同表中选择数据
【发布时间】:2020-06-04 19:59:22
【问题描述】:

我正在尝试从多个表中选择数据。主表是Notices

表格:注意事项

   +--------+-------------+----------------+
|编号 |通知代码 |公司号码 |
+--------+-------------+----------------+
| 96008 | 2410 | 09844265 |
| 96014 | 2450 | 02640968 |
| 96032 |第2443章03666759 |
+--------+-------------+----------------+

我必须从不同的表中为Table Notice 的行选择相关信息。下面是其他4张表以及它们与table Notices的关系

Table CompaniesTable Notices有直接关系

表:公司 Companies.Company_number = 通知。公司_编号 +----------------+--------------+--------+ |公司号码 |公司名称 |原文如此 | +----------------+--------------+--------+ | 02640968 | XYZ 物流 | 28220 | | 03666759 | OPQ 物流 | 41100 | | 09844265 | ABC 物流 | 49410 | +----------------+--------------+--------+

Table Sic_codesTable Notices 没有直接关系。但它有Table Companies

表:Sic_Codes。 公司.Sic1 = Sic_code.Code +-------+----------------+ |代码 |部门 | +-------+----------------+ | 28220 |制造 | | 41100 |建筑 | | 49410 |交通 | +-------+----------------+

Table Insovency_PractionarTable Notices 没有直接关系。还有一个Table Notice_insolvency_practitionar_ID用来创建这两个表之间的关系Table Insovency_Practionar and Table Notices

表:Notice_insolvency_practitionar_ID。 Notice_insolvency_practitionar_ID。 Notice_ID = 通知。 ID +-----------+----------------+ |通知ID | insolvency_practitioner_id | +-----------+----------------+ | 96008 | 1048 | | 96008 | 725 | | 96032 |第548章 +-----------+----------------+ 表:Insovency_Practionar 。 Insovency_Practionar.ID = Notice_insolvency_practitionar_ID。 Insolvency_Practiotionar_ID +--------+---------+ |编号 |姓名 | +--------+---------+ |第548章查理 | | 725 |比尔 | | 1048 |安德鲁 | +--------+---------+

我的预期输出如下:公司名称来自table company; sic1 和部门将来自table sic_code,从业者将来自table Insovency_Practionar

+----------------+--------------+--------+--------- --------+--------------+ |公司号码 |公司名称 |原文如此 |部门 |从业者 | +----------------+--------------+--------+--------- --------+--------------+ | 9844265 | ABC 物流 | 49410 |交通 |安德鲁 | | 2640968 | XYZ 物流 | 28220 |制造 |比尔 | | 3666759 | OPQ 物流 | 41100 |建筑 |查理 | +----------------+--------------+--------+--------- --------+--------------+

我在我的 QUERY 中使用了 LEFT Join。

这是我的查询

 SELECT n.company_number
 , c.company_name
 , c.sic1
 , s.sector
 ,i.name practitioner
 FROM notices n
 LEFT JOIN companies c
 ON c.company_number = n.company_number
 LEFT JOIN sic_codes s
 ON s.code = c.sic1 
 LEFT JOIN notice_insolvency_practitioners ni
 ON ni.notice_id = n.id 
 LEFT JOIN insolvency_practitioners i
 ON i.id = ni.insolvency_practitioner_id 
 where n.notice_code =2410

这是我的 SQL Fiddle。 http://sqlfiddle.com/#!9/4887e2/2

我想知道我的查询是否正确。或者有没有其他更好的方法来编写查询。最初,当我测试时,查询给了我错误的结果。

更新:我发现有一个重复的条目。这就是没有得到预期输出的原因。我现在已经纠正了。但是还是想知道我的查询是对的还是有更好的方法来写查询

【问题讨论】:

  • 这看起来是一个非常详细的问题。但是,如果您可以用简单的英语添加描述,您可能会帮助读者理解实际结果与预期结果之间的不同之处。有更多的行(四而不是三)和更多的列,但也许你可以缩小你想要关注的主要内容。
  • 我看不出你的结果有什么问题。
  • 请在您的帖子中添加minimal reproducible example,而不仅仅是在链接中。 (那么这些输入表是多余的。)在 MRE 中,您可以给出最少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)暂停整体目标的工作,将代码砍到第一个表达式,而不是给出你所期望的,说出你所期望的和原因。即第一个坏加入。不要只是给出错误的代码并要求我们调试。这也没有描述查询作为输入函数返回的内容,示例是什么的示例。我们如何帮助它正确? (修辞。)同样,MRE 的一部分。
  • 您如何将相同的通知 (96008) 分配给 2 个不同的从业者?
  • 请根据我的所有评论采取行动。 PS 这包括,从您的示例中删除不必要的列,确保它运行,然后将它们全部放在这里 - 完全相同的代码。不需要非代码格式的版本。 (你的表初始化被格式化为表是好的。)不要让我们去小提琴。但是我的评论说还有很多其他的事情要做。 PS我猜你是在给出选择及其输出来说明你想要的整体输出,但它们是一种误导和不清楚的方式来实现这一点,因为它们不是你运行的实际代码的子表达式和值。

标签: mysql join select


【解决方案1】:

我已经找到问题所在了。感谢@Viney

<pre>

+-----------+----------------------------+
| notice_id | insolvency_practitioner_id |
+-----------+----------------------------+
|     96008 |                       1048 |
|     96008 |                        725 |
|     96032 |                        548 |
+-----------+----------------------------+

</pre>

通知 id 96008 的重复条目。应该是这样的

<pre>
+-----------+----------------------------+
| notice_id | insolvency_practitioner_id |
+-----------+----------------------------+
|     96008 |                       1048 |
|     96014 |                        725 |
|     96032 |                        548 |
+-----------+----------------------------+

</pre>

我还编辑了我的问题并减少了额外的列以使其对用户可读

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    相关资源
    最近更新 更多