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

Форум MySQL

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

 

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

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

тема: Выборка из трех таблиц
 
 автор: SS   (24.04.2005 в 05:50)   письмо автору
 
 

Помогите с новой проблемой (форум перекопал, но недалеко продвинулся).

Есть три таблицы:
table1 (картинки)
id_1
field1_1
field1_2
table2 (комментарии)
id_2
op_1
field2_1
field2_2
table3 (пользователи)
id_1
op_2
field_1
field_2

у table1 и table2 id_1 = id_2
у table2 и table3 op_1 = op_2

Как сделать выборку и вывод на печать с трех таблиц?

Схема:

IMAGE1
comment1 - user1
comment2 - user2
comment3 - user3
IMAGE2
comment1 - user1
comment2 - user2
comment3 - user3
и т.д. .......

Полей и записей много, поэтому очень большое пожелание: если можно, то что-нибудь пооптимальнее.

   
 
 автор: cheops   (24.04.2005 в 14:59)   письмо автору
 
   для: SS   (24.04.2005 в 05:50)
 

Я немного переделал таблицы (везде назначил осмысленные имена), чтобы было удобнее составлять запрос, вот дамп новой базы данных
CREATE TABLE comments (
  id_comment int(11) NOT NULL auto_increment,
  name_comment text NOT NULL,
  puttime datetime NOT NULL default '0000-00-00 00:00:00',
  id_user int(11) NOT NULL default '0',
  id_image int(11) NOT NULL default '0',
  PRIMARY KEY  (id_comment),
  KEY id_user (id_user,id_image)
) TYPE=MyISAM;
INSERT INTO comments VALUES (1, 'Волшебно', '2005-04-24 14:50:44', 1, 1);
INSERT INTO comments VALUES (2, 'Не говори!', '2005-04-24 14:51:03', 2, 1);
INSERT INTO comments VALUES (3, 'А я что говорю?', '2005-04-24 14:51:21', 1, 1);
INSERT INTO comments VALUES (4, 'Не передаваемо!', '2005-04-24 14:52:15', 1, 2);
INSERT INTO comments VALUES (5, 'Эт точно', '2005-04-24 14:52:23', 2, 2);
CREATE TABLE images (
  id_image int(11) NOT NULL auto_increment,
  name text NOT NULL,
  PRIMARY KEY  (id_image)
) TYPE=MyISAM;
INSERT INTO images VALUES (1, 'Монета 1');
INSERT INTO images VALUES (2, 'Монета 2');
CREATE TABLE users (
  id_user int(11) NOT NULL auto_increment,
  name_user text NOT NULL,
  PRIMARY KEY  (id_user)
) TYPE=MyISAM;
INSERT INTO users VALUES (1, 'Пользователь 1');
INSERT INTO users VALUES (2, 'Пользователь 2');

Тогда запрос к этим трём таблицам может выглядеть следующим образом
SELECT * FROM comments, users, images 
WHERE images.id_image = comments.id_image AND
users.id_user = comments.id_user
ORDER BY images.id_image, comments.puttime

   
 
 автор: SS   (24.04.2005 в 23:48)   письмо автору
 
   для: cheops   (24.04.2005 в 14:59)
 

Отлично, все работает! Я дня три прокопался с этим, думал сам доеду... :)
Сейчас выборка происходит, только если все условия выполняются. Как выводить также и те картинки, у которых нет комментариев?

   
 
 автор: cheops   (25.04.2005 в 13:25)   письмо автору
 
   для: SS   (24.04.2005 в 23:48)
 

В этом же запросе вряд ли получится - их можно извлечь дополнительным запросом.

   
 
 автор: SS   (25.04.2005 в 18:33)   письмо автору
 
   для: cheops   (25.04.2005 в 13:25)
 

Покажите, пожалуйста, как выглядит упрощенная схема такого запроса в запросе?

   
 
 автор: cheops   (25.04.2005 в 21:41)   письмо автору
 
   для: SS   (25.04.2005 в 18:33)
 

А вложенный запрос не сработает, они только в MySQL 4.1 появились, у вас какая версия MySQL?

   
 
 автор: SS   (25.04.2005 в 23:25)   письмо автору
 
   для: cheops   (25.04.2005 в 21:41)
 

-- Версия сервера: 4.0.21
-- Версия PHP: 4.3.9

   
 
 автор: cheops   (26.04.2005 в 13:56)   письмо автору
 
   для: SS   (25.04.2005 в 23:25)
 

Нет, тогда не получится, получится только так: первым запросом вывести изображения у которых имеется комментарий, а вторым, отдельным запросом те, у которых нет ни одного комментария (сортировки средствами MySQL здесь к сожалению не получится). Можно сделать финт ушами, добавить системного пользователя в таблицу users (скажем с первичным ключём id_user = 0) и добавить каждому из изображений (автоматически) комментарий этого пользователя, а затем просто не выводить комментарий такого пользователя уже средствами PHP - грубо, но работает.

   
 
 автор: SS   (26.04.2005 в 18:22)   письмо автору
 
   для: cheops   (26.04.2005 в 13:56)
 

Вы хотите сказать, что нельзя вывести такой запрос:
<Вывести все картинки, удовлетворяющие запросу>
IMAGE, где
<если есть комментарии, у которых ID_COMMENT=ID_IMAGE, то вывести эти комментарии><если ID_USER_COMMENT=ID COMMENT, то вывести такого юзера>
и т.д. в цикле
???
Мне кажется это довольно простым запросом с парой условий, просто я не знаю как это написать.
Как же тогда работают гостевые книги, форумы и галереи с возможностью оставить комментарий - там же примерно то же самое, что и мне нужно?

   
 
 автор: cheops   (26.04.2005 в 23:10)   письмо автору
 
   для: SS   (26.04.2005 в 18:22)
 

Там не трёхтабличный запрос. Обычно запрашивают картинки - выводят их и для каждой картинки проверяют наличие комментариев. Т.е. система состоит из запроса - обработки результата в цикле и запроса в цикле не комментарии к изображениям.

   
 
 автор: SS   (27.04.2005 в 00:34)   письмо автору
 
   для: cheops   (26.04.2005 в 23:10)
 

Ну я же не знал, что тут такие тонкости с названиями. Я как думал, так и сказал. :)
Хорошо, помогите тогда пожалуйста с такой схемой, - мне важен результат, мне нужно вывести все картинки и все комментарии.

   
 
 автор: SS   (27.04.2005 в 22:57)   письмо автору
 
   для: cheops   (26.04.2005 в 23:10)
 

Очень жду!!! - у меня вся работа из-за этого встала.

   
 
 автор: cheops   (27.04.2005 в 23:37)   письмо автору
 
   для: SS   (27.04.2005 в 22:57)
 

Можно поступить примерно следующим образом
<?php 
  
// Устанавливаем соединение с базой данных 
  
include "config.php"
  
// Формируем запрос на выборку изображений
  // с сортировкой по имени изображения
  
$query "SELECT * FROM images ORDER BY name"
  
// Выполняем запрос 
  
$tb mysql_query($query); 
  
// Проверяем правильность выполнения запроса 
  
if(!$tb) exit(mysql_error()); 
  
// В цикле выполняем вывод изображений
  
while($img mysql_fetch_array($tb)) 
  { 
    echo 
$img['name']."<br>"
    
// Запрашиваем комментарии для данного изображения 
    
$query "SELECT comments.name_comment AS name_comment,
                     comments.puttime AS puttime,
                     users.name_user AS name_user
              FROM comments, users
              WHERE comments.id_image = 
$img[id_image] AND 
                    users.id_user = comments.id_user 
              ORDER BY comments.puttime DESC"
;
    
// Выполняем запрос 
    
$com mysql_query($query); 
    
// Проверяем правильность выполнения запроса 
    
if(!$com) exit(mysql_error()); 
    
// Если есть хоть один комментарий - выводим
    
if(mysql_num_rows($com)>0)
    {
      while(
$comment mysql_fetch_array($com)) 
      { 
        echo 
$comment['puttime']." - ".$comment['name_user']."<br>";
        echo 
$comment['name_comment']."<br>";
      } 
    }
    else
    {
      
// Здесь можно вывести, что комментарие нет
    
}
    echo 
"<br>"
  } 
?>

При использовании в первом запросе ограничения LIMIT (вы наверное всё равно будет постраничную навигацию использовать) заметного уменьшения скорости наблюдаться не должно.

   
 
 автор: SS   (28.04.2005 в 02:24)   письмо автору
 
   для: cheops   (27.04.2005 в 23:37)
 

Все супер, спасибо, работает!

   
Rambler's Top100
вверх

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