|
|
|
| Сейчас сижу на паре! Такое задание дали:
Написать один запрос к БД (host: local; name: bd_one; login: bg_login; password: bd_pass) которая по имени (FirstName) выбрала из двух таблиц:
Имя "tbName" поля : Name_id, FirstName, LastName, Phone_id
Имя "tbPhone" поля : Phone_id, PhoneNumber
следующие данные: LastName, PhoneNumber. По условиям задачи, не все люди имеют телефон.
В случае отсутствия телефона, вывести LastName, а в поле PhoneNumber - любое значение.
Помогите плз как можно скорей! | |
|
|
|
|
|
|
|
для: Mesm
(30.03.2006 в 18:28)
| | select LastName,PhoneNumber
from tbPhone left join tbName on tbPhone.Phone_id = tbName.Phone_id
where FirstName='$name' | |
|
|
|
|
|
|
|
для: Trianon
(30.03.2006 в 18:57)
| | Спасибо огромное! А точно работать то будет? :). Если не трудно, можно расписать (для себя), прочитал и ничего не понял. | |
|
|
|
|
|
|
|
для: Mesm
(30.03.2006 в 21:05)
| | Конечно, не будет. Писал по памяти, чтобы дать понять в каком направлении думать.
Дампа Вы не дали - проверить было не на чем. :)
А какие моменты непонятны? Я поясню. | |
|
|
|
|
|
|
|
для: Trianon
(30.03.2006 в 21:13)
| | Млин :(. А какой процент что это будет работать :) Дампа у меня тоже нет, он и не нужен, требовалось просто запрос написать.
Если не трудно можно пояснить следующие моменты:
select LastName,PhoneNumber
from tbPhone - тут все понятно
left join tbName on tbPhone.Phone_id = tbName.Phone_id - с вот этой строчкой не врубаюсь, почитал учебник, толком ничего не написано. Буду очень благодарен. | |
|
|
|
|
|
|
|
для: Mesm
(31.03.2006 в 12:20)
| | это означает что для левой таблицы будет подобрано соотвествие из правой по полю phone_id
а вам, возможно, больше подойдет такой вариант:
select LastName,PhoneNumber
from tbPhone, tbName where tbPhone.Phone_id = tbName.Phone_id
and FirstName='$name'
|
| |
|
|
|
|
|
|
|
для: Mesm
(31.03.2006 в 12:20)
| | Во-первых, как оказалось,я и вправду ошибся. Не специально. Правильно - так:
SELECT LastName,PhoneNumber
FROM tbName LEFT JOIN join tbPhone ON tbName.Phone_id = tbPhone.Phone_id
WHERE FirstName='$name'
|
Теперь о том, что это за конструкция:
FROM tbName LEFT JOIN join tbPhone ON tbName.Phone_id = tbPhone.Phone_id
|
Сперва строка попроще:
FROM tbName JOIN join tbPhone ON tbName.Phone_id = tbPhone.Phone_id
|
Так задается общая таблица, которая состоит из столбцов как из левой (tbName), так и из правой (tbPhone) таблицы (т.е. из 6 столбцов), и в которую входят строки имеющие соответствие, записанное в разделе ON, т.е. в данном случае те строки, в которых есть соответствия по полю Phone_id .
Далее, в конструкции SELECT LastName,PhoneNumber из шести столбцов выдергиваются только два нужных, а конструкция WHERE FirstName='$name' отсекает ненужные строки.
Такой запрос позволил бы нам получить по имени все фамилии, имеющие телефоны.
Но люди, по условию задачи, могут телефонов и не иметь. Поэтому в результирующую таблицу надо добавить из таблицы с именами (т.е. левой) те строки, для которых соответствия не нашлось. Делается это указанием модификатора LEFT перед JOIN.
FROM tbName LEFT JOIN join tbPhone ON tbName.Phone_id = tbPhone.Phone_id
|
| |
|
|
|