SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 15.07.2010 14:06:31

ivanz
Участник
Зарегистрирован: 21.05.2010
Сообщений: 21

Запрос (Из двух таблиц)

Здравствуйте!

Сперва хочю поблагодарить авторов за такой замечательный сайт, спасибО! Очень много полезной информации.

И хотел бы задать вопрос: Как создать запрос из двух таблиц:

Первая таблица _users:

id     name     username    
1      My_name1  My_username1
2      My_name2  My_username2
3      My_name3  My_username3
4      My_name4  My_username4
5      My_name5  My_username5
6      My_name6  My_username6

Вторая таблица _messages:

id     name     text
1      My_name1  Text10     
2      My_name1  Text11         
3      My_name1  Text12         
4      My_name1  Text13         
5      My_name1  Text14       
6      My_name2  Text20           
7      My_name2  Text24       
8      My_name6  Text67

Как получить такую таблицу:

id     name     text         username    
1      My_name1  Text10      My_username1
2      My_name1  Text11      My_username1   
3      My_name1  Text12      My_username1   
4      My_name1  Text13      My_username1   
5      My_name1  Text14      My_username1 
6      My_name2  Text20      My_username2     
7      My_name2  Text24      My_username2 
8      My_name6  Text67      My_username6     

Если количество строк первой и второй таблиц разное!
Спасибо!

Неактивен

 

#2 15.07.2010 14:33:42

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Запрос (Из двух таблиц)

SELECT m.*, u.username
FROM _messages m JOIN _users u USING(name);

Но лучше всё-таки в _messages хранить ссылку на _user.id, а не на _user.name.

Неактивен

 

#3 15.07.2010 14:43:00

ivanz
Участник
Зарегистрирован: 21.05.2010
Сообщений: 21

Re: Запрос (Из двух таблиц)

А почему так лучше будет?

Неактивен

 

#4 15.07.2010 14:53:24

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Запрос (Из двух таблиц)

а) будете хранить меньше информации
б) запрос будет отрабатывать быстрее (т.к. будут более короткие индексы)

Неактивен

 

#5 15.07.2010 15:24:28

ivanz
Участник
Зарегистрирован: 21.05.2010
Сообщений: 21

Re: Запрос (Из двух таблиц)

Запрос, который Вы написали выше выводит таблицу если в двух таблицах есть одинаковая строка. А как Выводить полностью всю таблицу _messages и если name не найдено в таблице _users вывести пустое значение?

Неактивен

 

#6 15.07.2010 15:29:36

ivanz
Участник
Зарегистрирован: 21.05.2010
Сообщений: 21

Re: Запрос (Из двух таблиц)

Как альтернатива я в php в цикле могу сделать запрос и получать данные:

$sql = "SELECT * FROM #__messages WHERE #__messages.`roomid` = ".$roomid." ORDER BY id DESC LIMIT 50";
...

for ($i=0; $i<count($row); $i++) {
   $username     = getusernamebyname($row[$i]['name']);
}

function getusernamebyname($name) {
   $sql = "SELECT  #__users.`username` FROM #__users WHERE #__users.`name` = '".$name."' LIMIT 1";
   ...
   return $uname;          
}


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

Неактивен

 

#7 15.07.2010 15:38:52

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Запрос (Из двух таблиц)

ivanz написал:

Запрос, который Вы написали выше выводит таблицу если в двух таблицах есть одинаковая строка. А как Выводить полностью всю таблицу _messages и если name не найдено в таблице _users вывести пустое значение?

Замените JOIN на LEFT JOIN.

Неактивен

 

#8 15.07.2010 17:13:24

ivanz
Участник
Зарегистрирован: 21.05.2010
Сообщений: 21

Re: Запрос (Из двух таблиц)

Огромное спасибо! Все работает!

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson