我有两张表Schools
和Users
表学校
-----------------------------------------------------
| id | name | city | major | userID |
----------------------------------------------------|
| 1 | school A | chicago | CS | 1 |
----------------------------------------------------|
| 2 | school B | chicago | CS | 1 |
----------------------------------------------------|
| 3 | school A | chicago | CS | 2 |
----------------------------------------------------|
| 4 | school C | chicago | Art | 2 |
----------------------------------------------------|
| 5 | school B | chicago | CS | 3 |
----------------------------------------------------|
| 6 | school D | chicago | Math | 3 |
----------------------------------------------------|
| 7 | school A |New York | CS | 3 |
----------------------------------------------------|
| 8 | school B | chicago | Art | 3 |
-----------------------------------------------------
表用户
--------------------
| id | name |
____________________
| 1 | User A |
____________________
| 2 | User B |
____________________
| 3 | User C |
____________________
| 4 | User D |
____________________
| 5 | User E |
____________________
userID
表中的schools
字段是id
表中users
字段的外键。我想写一个带有给定userID
的MySQL语句,并列出该用户的所有同学。
因此,对于上面的示例,User A
(ID#1)的同伴是与User A
去过同一所在学校的用户,位于同一city
,并具有相同的major
。因此,User A
的有效同学仅为User B
(ID#2)和User C
(ID#3)。
现在,我正在使用两个MySQL语句来实现这一目标。第一个就是这个
SELECT id FROM schools WHERE userID = '1'
列出User A
的所有学校。然后我使用PHP循环遍历结果,并为每一行运行以下
SELECT userID from schools WHERE
name city LIKE '%$chicago%'
AND name LIKE '%$school A%'
AND major LIKE '%$CS%'
这很好,并返回正确的userID列表。但是,我想知道是否有更有效的方法在一个SQL语句中执行此操作,而无需使用PHP。
答案 0 :(得分:2)
你可以这样做:
select distinct u.name
from Users u
join School s on s.userID = u.id
join (
select distinct s.name, s.city
from School s
inner join Users u on u.id = s.userID
where u.name = 'User A'
) aux on s.name = aux.name and s.city = aux.city
where u.name <> 'User A'
在aux
查询中,您选择name
的{{1}}和city
,然后选择符合这些要求的所有@user
不是users
本身。
您可以用变量替换“用户A”。
答案 1 :(得分:-2)
您的SCHOOL表被认为是对的。它违反了关系数据库管理系统的规则。
必须再增加3个表:一个用于学校名称,另一个用于城市名称,第三个用于主要名称。所有这些必须是带有ID的不同表格。
显然,名称列和城市列具有多对多关系,因此必须为此创建查找表。
同样适用于主要栏目。它似乎很多表,但是你提取任何值都很简单。
好的,我对你的表做了一些改动。我更喜欢这种方式来存储数据:
table student
col.
id
name
major
reg.no. (to make each student unique)
table school
col.
id
name
table city
col.
id
name
table student_school (lookup table)
col.
student_id
school_id
table school_city
col.
school_id
city_id
首选这些表,您会发现每个查询都可以轻松完成。如果您对此有任何疑问,请与我联系。