2010-07-24 60 views
4

假设我有一个表,其功能是专门在OOP方面来链接其他两个表连接的两个表一个MySQL选择查询。如何做另一个表

假设我有两个表:一个人的名字,另一个用于电话号码:

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,其电话NUM所有人ber先说,(234)。

我怎么会去这个表结构...我会运行哪些查询中联的选择查询?

+1

你要找的关键字是'JOIN'。 – pascal 2010-07-24 07:45:35

+0

请亲切地使两个电话号码看起来不同,以避免我们混淆 – nawfal 2012-01-12 20:46:50

回答

3

第一,唯一的理由这样做表,如果你有很多一对多的关系。 虽然一个人可以有很多电话号码,真的可以有一个电话号码有很多人吗? 如果这是真的,那么你的模式实现了这一要求,但这似乎有点过度设计给我:-)

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

SELECT t1.name as name,t2.number from table1 t1,table2 t2,table3 t3其中t2.number像'234%'和t3.personid = t1.id和t3.phoneid = t2。 ID;

您也可以重写“blah.id = blah.id”作为加盟,如果你需要外连接语义(包括与NULL的某些字段)。

+0

+1为幽默:) – nawfal 2012-01-12 20:49:42

+1

@ Jon-Watte“真的可以有一个电话号码有很多人吗”?是:在室友或家人中共享固定电话。 – Medorator 2013-08-04 12:06:03

0

我假设了人名和电话号码的列名,并且假定您想返回一个人名单,其中的任何电话号码开头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,因此我可能会添加一些特定于平台的功能,请告诉我是否有任何问题。

另外,您可以使用内部联接,而不是一个“中”,但这样一来感觉它更紧密地描述了预期的效果。此外,它避免了必须做任何“区别”,以避免有两个电话号码的人开始出现两次。

0

对于数字的人:

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 
0

选择person.id,从
如表1人person.name,
表2的人数字,
表3作为链接
其中每son.id =链接。人-ID
和numbers.id = link.phone数-ID
和numbers.phonenumber像 '234%'

0

这将是像下面这样。使用标准SQL,在这里我们使用一个到人表的内部联接来获取名字,然后是到结果子查询的另一个联接(通过你的电话模式进行过滤)来获得匹配数字的人。

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 
0

首先...你不需要在Table 3ID

只要使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%'