繁体   English   中英

如何对另一个表链接的两个表执行MySQL选择查询

[英]How to do a MySQL select query on two tables linked by another table

假设我有一个表,其功能是专门根据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)。

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

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

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

SELECT t1.name作为名称,t2.number来自table1 t1,table2 t2,table3 t3其中t2.number喜欢'234%'和t3.personid = t1.id和t3.phoneid = t2.id;

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

我假设了人名和电话号码的列名,并假设您想要返回一个列表,其中包含任何电话号码开头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”,但这种方式感觉它更接近地描述了所需的效果。 此外,它避免了必须做任何“区分”,以避免让有2个电话号码开始234的人出现两次。

对于一个人的数字:

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

选择person.id,person.name来自
table1 as person,
table2作为数字,
table3作为链接
其中person.id = link.person-id
和numbers.id = link.phone-number-id
和numbers.phonenumber喜欢'234%'

它将类似于以下内容。 使用标准SQL,这里我们使用person表的内连接来获取名称,然后使用另一个连接到结果子查询(通过电话模式过滤)以获得匹配数字的人。

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

首先...... 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%'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM