![](/img/trans.png)
[英]How to select all records from a table that do not exist in a union of two another tables in 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.