MySQL 获取相关用户

Posted

技术标签:

【中文标题】MySQL 获取相关用户【英文标题】:MySQL to fetch related users 【发布时间】:2012-07-06 15:54:57 【问题描述】:

我有两张桌子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   |
____________________

schools 表中的userID 字段是users 表中id 字段的外键。我想编写一个 mysql 语句,它接受给定的userID 并列出该用户的所有同学。

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

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

【问题讨论】:

请重新设计您的表格。它们没有被规范化,可能会成为许多致命事物的牺牲品……请参见此处:***.com/a/11363740/561731 和 OP 下的相关 cmets 这是另一条可能有帮助的评论:***.com/questions/11363688/mysql-select-women-not-men/… 【参考方案1】:

你可以这样做:

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 查询中,您选择@usernamecity,然后选择所有具有这些要求的users,而不是@user 本身。

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

【讨论】:

【参考方案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

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

【讨论】:

我不得不在这个答案上做很多工作以使其清晰易读,所以将来,您在回答时可以遵循这种格式吗?特别是,如果您不使用诸如“ur”之类的 textspeak 缩写词来表示“your”之类的词,我们建议您这样做。

以上是关于MySQL 获取相关用户的主要内容,如果未能解决你的问题,请参考以下文章

mysql

MySQL索引相关

MySQL索引相关 𱌑

MySQL 用户与权限管理

MYSQL 查询 - 获取与帖子相关的最新评论

Mysql用户管理相关