2014-08-28 3 views
1

Я пытаюсь присоединиться к 3 таблицам одновременно, чтобы получить «School Name» из таблицы school_informations и «User ID, User Name, User Surname» из таблицы входа.MySQL присоединяется к ошибке синтаксиса

Вещь, которую мне нужно сделать, это получить «данные пользователя», «данные школы» и сопоставить с помощью user_id и school_id в моей таблице asc_to_school.

Вот мой schools_informations стол, который я должен взять на себя school_id и сопоставить его в asc_to_schools таблице и schools_name для отображения в качестве выходных (переменных $):

id | school_id | school_name  | school_type  | type | la_name   | region 
----+-----------+-----------------+-----------------+------+-----------------+-------- 
1 | 8432627 | Glasgow Gaelic | Local Authority | Both | Glasgow City | WE 
2 | 5349834 | Breadalbane  | Local Authority | Both | Perth & Kinross | TF 
3 | 7235142 | ForestFortres | Local Authority | Both | undefined  | WE 

Вот мой Логин таблица:

id | username | pass | region | la    | name | surname | role 
----+----------+------+--------+------------------+-------+---------+------ 
1 | Can  | **** | none | Clackmannanshire | Can | Sinal | ASC 
2 | Tumer | **** | none | Argyll & Bute | Tumer | Kologlu | GM 
3 | Kerem | **** | none | Somethingelse | Kerem | Citak | ADM 
4 | Pelin | **** | none | Somethingelse | Pelin | Karahan | GM 
5 | Irem  | **** | none | Somethingelse | Irem | Sevinc | CC 

Наконец мой asc_to_school таблица выглядит следующим образом:

user_id | school_id 
---------+----------- 
    1 | 1 
    2 | 1 
    3 | 2 
    4 | 2 
    5 | 3 

Вот запрос я пробовал:

SELECT 
u.id, u.name, u.surname, u.role, 
c.user_id, c.school_id, 
s.school_id,s.school_name 
FROM login u, asc_to_school c, school_informations s 
WHERE u.role = 'ASC' AND c.user_id = u.id AND c.school_id = s.id 

Как вы можете догадаться SQL возвращается пустой результат ... Я искал для этого и нашел этот пример (запрос я пытался в другой вопрос), но оно не работа для меня.

Как я могу получить: Только пользователи с «ролью» = «ASC» и подключить этот пользователь со школой, используя asc_to_school таблицу.

EDIT

Вот последний запрос я есть, который работает в SQL Fiddle:

SELECT 
u.id, u.name, u.surname, c.school_id, 
s.school_id,s.school_name 
FROM login u, asc_to_school c, school_informations s 
WHERE u.role = 'ASC' AND c.user_id = u.id AND c.school_id = s.id 

И вот результат:

object(mysqli_result)#3 (5) { 
    ["current_field"]=> 
    int(0) 
    ["field_count"]=> 
    int(5) 
    ["lengths"]=> 
    NULL 
    ["num_rows"]=> 
    int(0) 
    ["type"]=> 
    int(0) 
} 
+2

Ваш запрос выглядит хорошо (за исключением того, что неявные объединения являются архаичными, вы должны использовать явные предложения 'JOIN'). Он возвращает результат для меня: http://www.sqlfiddle.com/#!2/8e9c3c/1 – Barmar

+0

Это школьное задание? Вы действительно должны учиться писать запросы в гораздо более стандартном формате ansi-92 с помощью объединений ... то, что вы пишете здесь, очень старое и трудно читаемое ... все равно действует одинаково. Хех, ваше сглаживание добавляет путаницу. В противном случае ... это выглядит правильно – Twelfth

+0

@Twelfth Каждому свое, я настоятельно рекомендую aliasing. Он позволяет иметь значимые имена таблиц, не создавая слишком многословных запросов. – Barmar

ответ

0

Попробуйте это:

SELECT 
    u.id, 
    u.name, 
    u.surname, 
    u.role, 
    c.user_id, 
    s.school_id, 
    s.school_name 
FROM login u 
INNER JOIN asc_to_school c ON c.user_id = u.id 
INNER JOIN school_informations s ON s.id = c.school_id 
WHERE TRIM(u.role) = 'ASC' 
+1

Почему вы использовали 'LIKE' вместо' = '? Это несовместимое изменение в логике. – Barmar

+0

Поскольку он получил пустой набор результатов, в поле ролей могут быть дополнительные символы или пробелы. Вот почему я попросил ОП попробовать. – Donal

+1

Лучше будет 'WHERE TRIM (u.role) = 'ASC''. Потому что 'LIKE' также будет соответствовать' ASC1'. – Barmar

0

Используйте Явный синтаксис, что гораздо легче понять и поддерживать:

SELECT u.id, u.name, u.surname, u.role 
    , c.user_id, c.school_id 
    , s.school_name 
FROM login u 
JOIN asc_to_school  c ON c.user_id = u.id 
JOIN school_informations s ON s.school_id = c.school_id -- ?not s.id? 
WHERE u.role = 'ASC'; 

Я подозреваю, вы действительно хотите, чтобы присоединиться к s.school_id? В вашем примере указано иное, но я подозреваю, что данные в вашем пример вводит в заблуждение. Текст говорит:

Вот мой schools_informations стол, который я должен взять на себя school_id и сравнить его в таблице asc_to_schools

Жирный курсив мой.
И school_id был продублирован в списке SELECT. Многие клиенты не проглатывают повторяющиеся имена столбцов.

+0

Вы можете быть на что-то с дублирующимися столбцами school_id. – Donal