MySQL 获取相关用户
Posted
技术标签:
【中文标题】MySQL 获取相关用户【英文标题】:MySQL to fetch related users 【发布时间】:2012-07-06 15:54:57 【问题描述】:我有两张桌子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 |
____________________
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
查询中,您选择@user
的name
和city
,然后选择所有具有这些要求的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 获取相关用户的主要内容,如果未能解决你的问题,请参考以下文章