MySQL to fetch related users

Обновить

November 2018

Просмотры

119 раз

2

У меня есть две таблицы 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таблице. Я хочу написать заявление MySQL , который принимает данный userIDи перечисляет все одноклассник этого пользователя.

Таким образом, для приведенного выше примера, класс помощник 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%'

Это отлично работает и возвращает правильный список UserIds. Тем не менее, мне интересно, если есть более эффективный способ сделать это в один SQL заявление и без использования PHP.

2 ответы

-2

Ваша таблица SCHOOL не считается правильным. Это нарушает правила реляционных систем управления базами данных.

Нужно сделать еще 3 таблицы: один для названия школы, другой для названия города, а третий для основного имени. Все они должны быть разные таблицы с идентификаторами.

Очевидно, имя столбца и город столбец имеют много-ко-многим, так нужно сделать таблицу поиска для этого.

То же относится к основному колонке. Похоже, что много таблиц, но тогда ваша добыча любого значения будет простой.

Хорошо, я сделал некоторые изменения в таблицы. Я предпочитаю этот способ хранения данных:

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

Предпочитают эти таблицы, и вы увидите, что каждый запрос может быть сделано с легкостью. Если у вас есть какие-либо проблемы с пониманием этого, дайте мне знать.

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«S и city» S в А , @userа затем выбрать все usersэти требования , и которые не @userсама.

Вы можете заменить «User A» с помощью переменной.

aF.