2

我有两张桌子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的外键。我想编写一个 MySQL 语句,它接受一个给定的并列出该用户的所有同学。idusersuserID

因此,对于上面的示例, User A(ID#1) 的同学是与 上同一所学校User A、位于同一学校city并具有相同的用户major。因此,有效的同学User A只有User B(ID#2) AND 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%'

这可以正常工作并返回正确的用户 ID 列表。但是,我想知道是否有一种更有效的方法可以在一条 SQL 语句中执行此操作而无需使用 PHP。

4

2 回答 2

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查询中,您选择 a 的name's 和city's,@user然后选择所有users具有这些要求且不是@user本身的要求。

您可以用变量替换“用户 A”。

于 2012-07-06T16:04:12.677 回答
-2

您的 SCHOOL 表被认为不正确。它违反了关系数据库管理系统的规则。

一个人必须多做 3 个表格:一个是学校名称,另一个是城市名称,第三个是专业名称。所有这些都必须是具有 id 的不同表。

显然 name 列和 city 列具有多对多的关系,因此必须为此制作一个查找表。

这同样适用于主要列。看起来有很多表,但是您提取任何值都会很简单。

好的,我对您的表格进行了一些更改。我更喜欢这种方式来存储数据:

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

更喜欢这些表,您会发现每个查询都可以轻松完成。如果您对此有任何理解问题,请告诉我。

于 2012-07-06T16:21:39.517 回答