MySQL, выборка данных из связанных таблиц

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

MySQL, выборка данных из связанных таблиц

Сообщение FaKk2 » 13.07.2005 (Ср) 18:55

Есть три таблицы:

Код: Выделить всё
users
------
id
username


Код: Выделить всё
evaluations
-------------
id
user_id
moderator_id
evaluation_type_id


Код: Выделить всё
evaluation_types
-------------------
id
description


А смысл таков:
Мне нужно выбрать все содержимое таблицы evaluations. Естественно поля user_id, moderator_id, evaluation_type_id нужно заменить значениями из связанных таблиц, т.е. итоговая таблица должна состоять из следующих полей:

Код: Выделить всё
result table
-------------
evaluations.id
users.username AS User
users.username AS Moderator
evaluation_types.description


На текущий момент я это делаю в два этапа. На первом этапе я получаю таблицу вида

Код: Выделить всё
result table
-------------
evaluations.id
users.id AS User
evaluations.moderator_id
evaluation_types.description


с помощью запроса:
Код: Выделить всё
SELECT `evaluations`.`id`, `users`.`username` AS `User`, `evaluation_types`.`description`, `evaluations`.`moderator_id` AS `moderator`
FROM `evaluations`, `users`, `evaluation_types`
WHERE `evaluations`.`user_id`=`users`.`id`
AND `evaluations`.`evaluation_type_id`=`evaluation_types`.`id`
AND `users`.`id`='".request("user_id")."';


На втором этапе, я в цикле прохожу по всей таблице и для каждой строки делаю отдельный запрос:
Код: Выделить всё
SELECT `username` FROM `users` WHERE `id`=".$evaluations[$i]["moderator"]


Как вы заметили все делается в два шага, что не есть гуд, так как я уверен это решается средствами самой БД. Два шага проходят потому что не происходит выборка имени модератора, потому что я не знаю как это сделать. Дело в том что и User и Moderator находятся в одной таблице. Это значит если я напишу условие следующего вида:
Код: Выделить всё
WHERE `evaluations`.`user_id`=`users`.`id`
AND `evaluations`.`moderator_id`=`users`.`id`
AND  `evaluations`.`evaluation_type_id`=`evaluation_types`.`id`
AND `users`.`id`='".request("user_id")."';


Выборка будет только тогда, когда User и Moderator будут одинаковы.

Вот я и ломаю голову над тем, как составить такой селект, чтоб база мне вернула имя модератора в любом случае.

Я буду рад любым предложениям.
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.07.2005 (Чт) 2:12

Одниз запросом кажется не получится, потому что в SELECT ты не сможешь указать, какие users отправлять на users, а какие на moderators.
Поэтому делаем вспомогательный запрос:

Код: Выделить всё
SELECT evaluations.id, users.username AS User, evaluations.moderator_id, evaluation_types.description
FROM users INNER JOIN (evaluation_types INNER JOIN evaluations ON evaluation_types.id = evaluations.evaluation_type_id) ON users.id = evaluations.user_id;


А из программы используем только второй:
Код: Выделить всё
SELECT Запрос1.id, Запрос1.User, users.username AS Moderator, Запрос1.description
FROM Запрос1 INNER JOIN users ON users.id = Запрос1.moderator_id;
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 14.07.2005 (Чт) 7:32

Э... Не очень понял задачу, но попробуй так:
Код: Выделить всё
SELECT e.id as EvaluationsID, u.username as User, m.username as Moderator, et.description as EvaluationType
FROM evaluations e, evaluation_types et, users u, users m
WHERE e.evaluation_type_id = et.id
  AND e.user_id = u.id
  AND e.moderator_id = m.id
Lasciate ogni speranza, voi ch'entrate.

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 14.07.2005 (Чт) 7:59

alibek

Поразительно, это exactly к чему я подбирался мысленно!
Спасибо тебе большое, хоть его на хлеб и не намажешь :)

GSerg
Твой метод я не пытался применить, но все равно спасибо за внимание.
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

    TopList  
cron