Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Двухтабличный запрос
 
 автор: Mesm   (30.03.2006 в 18:28)   письмо автору
 
 

Сейчас сижу на паре! Такое задание дали:
Написать один запрос к БД (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 - любое значение.

Помогите плз как можно скорей!

   
 
 автор: Trianon   (30.03.2006 в 18:57)   письмо автору
 
   для: Mesm   (30.03.2006 в 18:28)
 

select LastName,PhoneNumber
from tbPhone left join tbName on tbPhone.Phone_id = tbName.Phone_id
where FirstName='$name'

   
 
 автор: Mesm   (30.03.2006 в 21:05)   письмо автору
 
   для: Trianon   (30.03.2006 в 18:57)
 

Спасибо огромное! А точно работать то будет? :). Если не трудно, можно расписать (для себя), прочитал и ничего не понял.

   
 
 автор: Trianon   (30.03.2006 в 21:13)   письмо автору
 
   для: Mesm   (30.03.2006 в 21:05)
 

Конечно, не будет. Писал по памяти, чтобы дать понять в каком направлении думать.
Дампа Вы не дали - проверить было не на чем. :)
А какие моменты непонятны? Я поясню.

   
 
 автор: Mesm   (31.03.2006 в 12:20)   письмо автору
 
   для: Trianon   (30.03.2006 в 21:13)
 

Млин :(. А какой процент что это будет работать :) Дампа у меня тоже нет, он и не нужен, требовалось просто запрос написать.
Если не трудно можно пояснить следующие моменты:

select LastName,PhoneNumber
from tbPhone - тут все понятно

left join tbName on tbPhone.Phone_id = tbName.Phone_id - с вот этой строчкой не врубаюсь, почитал учебник, толком ничего не написано. Буду очень благодарен.

   
 
 автор: Loki   (31.03.2006 в 12:36)   письмо автору
 
   для: Mesm   (31.03.2006 в 12:20)
 

это означает что для левой таблицы будет подобрано соотвествие из правой по полю phone_id
а вам, возможно, больше подойдет такой вариант:

select LastName,PhoneNumber 
from tbPhone, tbName where tbPhone.Phone_id = tbName.Phone_id
and FirstName='$name'

   
 
 автор: Trianon   (31.03.2006 в 13:04)   письмо автору
 
   для: 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

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования