【问题标题】:How to do a MySQL select query on two tables linked by another table如何对由另一个表链接的两个表执行 MySQL 选择查询
【发布时间】:2011-03-20 10:49:19
【问题描述】:

假设我有一个表,其功能是专门根据 OOP 链接另外两个表。

假设我有两张表:一张是人名,另一张是电话号码:

Table 1:
id   person's name
1    John
2    Smith

Table 2:
id   Phone number
5     23424224
6      23424242

然后我有第三个表格,将这个人及其各自的电话号码联系起来:

Table 3:
id    person-id    phone-number-id
1         1           5
2         2           6

因此,约翰的电话号码是 23424224,而史密斯的电话号码是 23424242。

我想运行一个 SQL 查询来从表 1 中获取所有电话号码以 (234) 开头的人。

我将如何在此表结构中链接选择查询...我将运行什么查询?

【问题讨论】:

  • 您要查找的关键字是JOIN
  • 请让两个电话号码看起来不同,以免我们混淆

标签: mysql sql database select


【解决方案1】:

这将类似于以下内容。使用标准 SQL,这里我们使用对 people 表的内部连接来获取姓名,然后对生成的子查询(通过您的电话模式过滤)进行另一个连接来获取匹配号码的人员。

SELECT T1.fullname, T.phone_number
FROM TABLE3 AS T3
INNER JOIN TABLE1 AS T1
      ON T3.person_id = T1.id
INNER JOIN (
      SELECT phone_id, phone_number
      FROM TABLE2
      WHERE phone_number LIKE '%PATTERN%'
) AS T
     ON T3.phone_id = T.id

【讨论】:

    【解决方案2】:

    首先...您不需要Table 3 中的列id

    只需将 personId 和 phoneId 设为您的主键

    这就是您的多对多表的目的(将多个电话与同一个人关联)。您可以为不同的电话 ID 使用相同的人员 ID,反之亦然,也就是说,您可以为不同的人员 ID 设置相同的电话 ID。您永远不会有两行具有相同的人员 ID 和电话 ID。这根本没有意义。

    通过此查询,您将获得预期的结果:

    SELECT p.*
    FROM Person as p, Phone as ph, PersonPhone as pf
    WHERE pf.PersonId = p.Id AND pf.PhoneId = ph.Id and ph.Number like '234%'
    

    【讨论】:

      【解决方案3】:


      中选择person.id、person.name table1 作为人,
      table2 作为数字,
      table3 作为链接
      其中 person.id=link.person-id
      和 numbers.id=link.phone-number-id
      和 numbers.phonenumber 之类的 '234%'

      【讨论】:

        【解决方案4】:

        对于一个人的数字:

        SELECT persons.name, numbers.phone_number FROM persons
          LEFT JOIN person_number ON person_number.person-id = persons.id
          LEFT JOIN numbers ON person_number.phone-number-id = numbers.id
        

        对于一个号码的人

        SELECT persons.name, numbers.phone_number FROM numbers
          LEFT JOIN person_number ON person_number.phone-number-id = numbers.id
          LEFT JOIN persons ON person_number.person-id = persons.id
        

        【讨论】:

          【解决方案5】:

          我假设了人员姓名和电话号码的列名,并假设您想要返回具有任何个以 234 开头的电话号码的人员列表(而不是他们的所有电话号码都必须开始 234)。

          SELECT 
              persons-name
          FROM
              Table1
          WHERE
              id IN
                  (SELECT
                       Table3.person-id
                   FROM
                       Table3
                       INNER JOIN Table2 ON Table2.id = Table3.phone-number-id
                   WHERE
                       phone-number like '234%')
          

          我不得不承认我只知道 MS-SQL,所以我可能会添加一些特定于平台的功能,如果您有任何问题,请告诉我。

          或者,您可以使用内部连接而不是“in”,但这种方式感觉更接近于描述所需的效果。此外,它还避免了必须做任何“区分”来避免有人以 234 开头的 2 个电话号码出现两次。

          【讨论】:

            【解决方案6】:

            首先,创建该表的唯一原因是您有一个多对多关系。 虽然一个人可以有很多电话号码,但一个电话号码真的可以有很多人吗? 如果这是真的,那么您的架构实现了该要求,但这对我来说似乎有点过度设计:-)

            其次,这是一个相当简单的连接。您要做的是首先选择有问题的电话号码,然后从第三个表中选择人员 ID,然后从第一个表中选择名称。比如:

            SELECT t1.name as name, t2.number from table1 t1, table2 t2, table3 t3 where t2.number like '234%' and t3.personid = t1.id and t3.phoneid = t2.id;

            如果您需要外连接语义(包括某些带有 NULL 的字段),您还可以将“blah.id = blah.id”重写为连接。

            【讨论】:

            • @Jon-Watte “一个电话号码真的可以有很多人吗”?是:室友或家人共享固定电话。
            猜你喜欢
            • 2019-11-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多