MySQL用于获取相关用户

时间:2012-07-06 15:54:57

标签: php mysql sql phpmyadmin

我有两张表SchoolsUsers

表学校

-----------------------------------------------------
| 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。

2 个答案:

答案 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

首选这些表,您会发现每个查询都可以轻松完成。如果您对此有任何疑问,请与我联系。