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

Форум MySQL

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

 

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

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

тема: Выборка всех значений из двух таблиц
 
 автор: steiger   (09.12.2009 в 12:56)   письмо автору
 
 

Сразу извинюсь, если подобный вопрос уже был.
Есть две таблицы. В одной хранятся события, в другой - имена фотографий к ним. Нужно вывести все события с фотографиями в виде
- Событие 1
--- Фото 1
--- Фото 2
- Событие 2
--- Фото 3
и т.д.

При простом объединении таблиц (по id_event) выводится по одной фотографии к каждому событию.

Дамп таблиц

CREATE TABLE IF NOT EXISTS `events` (
  `id_event` int(11) NOT NULL auto_increment,
  `e_title` varchar(255) NOT NULL default '',
  `e_text` text NOT NULL,
  `e_date` datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (`id_event`)
) ENGINE=MyISAM;

CREATE TABLE IF NOT EXISTS `events_photos` (
  `id_photo` int(11) NOT NULL auto_increment,
  `p_small` varchar(255) NOT NULL default '',
  `p_big` varchar(255) NOT NULL default '',
  `event_id` int(11) NOT NULL,
  PRIMARY KEY  (`id_photo`)
) ENGINE=MyISAM;

Помогите, пожалуйста...

  Ответить  
 
 автор: Trianon   (09.12.2009 в 13:22)   письмо автору
 
   для: steiger   (09.12.2009 в 12:56)
 

при простом соединении по id_event выводятся все фото, и события, им соответствующие.

  Ответить  
 
 автор: steiger   (09.12.2009 в 15:34)   письмо автору
 
   для: Trianon   (09.12.2009 в 13:22)
 

Попробую объяснить по-человечески. Запрос

SELECT e.id_event,e.e_title,
                           p.id_photo,p.p_small,p.event_id
                           FROM events
                           AS e
                           JOIN events_photos
                           AS p
                           ON p.event_id=e.id_event

на самом деле выводит все фото и события. А если каждому событию соответствует несколько фотографий? Тогда событие выведется несколько раз. В этом и проблема.


Array ( [id_event] => 1 [e_title] => Событие 1 [id_photo] => 1 [p_small] => 1260123398_sm.jpg [event_id] => 1 ) 
Array ( [id_event] => 1 [e_title] => Событие 1 [id_photo] => 2 [p_small] => 1260126315_sm.jpg [event_id] => 1 ) 
Array ( [id_event] => 1 [e_title] => Событие 1 [id_photo] => 3 [p_small] => 1260125980_sm.jpg [event_id] => 1 ) 
Array ( [id_event] => 2 [e_title] => Событие 2 [id_photo] => 4 [p_small] => 1260126031_sm.jpg [event_id] => 2 ) 
Array ( [id_event] => 1 [e_title] => Событие 1  [id_photo] => 5 [p_small] => 1260274054_sm.jpg [event_id] => 1 )

  Ответить  
 
 автор: Trianon   (09.12.2009 в 16:02)   письмо автору
 
   для: steiger   (09.12.2009 в 15:34)
 

SQL всегда возвращает прямоугольный набор результата запроса.
На стороне приложения средствами php можно спокойно переделать его в нужный иерархический вид. В запросе, впрочем, имеет смысл указать сортировку в том числе и по id события.

Примеров в этом разделе - масса. В том числе и моих.

  Ответить  
 
 автор: steiger   (09.12.2009 в 16:48)   письмо автору
 
   для: Trianon   (09.12.2009 в 16:02)
 

Если бы я понимал, каким образом его можно переделать, я бы не писал сюда и никого не мучил)
Попробовал добавить GROUP BY id_event - не помогло.

  Ответить  
 
 автор: Trianon   (09.12.2009 в 18:09)   письмо автору
 
   для: steiger   (09.12.2009 в 16:48)
 


<?php

$sql 
"
SELECT e.id_event,e.e_title,  p.id_photo
  FROM events AS e
    LEFT JOIN events_photos AS p ON p.event_id=e.id_event 
  ORDER BY e.e_title, e.id_event, p.id_photo
"
;

$res mysql_query($sql) or exit("Error in $sql : ".mysql_error());
for(
$lastid null$row mysql_fetch_assoc($res); )
{
  
$id_event $row['id_event'];
  
$e_title $row['e_title'];
  
$id_photo $row['id_photo'];
  if(
$lastid !== $id_event)
  {
    echo 
"<hr/> Событие $id_event ($e_title)";
    
$lastid $id_event;
  }
  echo 
"<br/> Фото  <img src=$id_photo.gif />";
}

  Ответить  
 
 автор: steiger   (09.12.2009 в 18:40)   письмо автору
 
   для: Trianon   (09.12.2009 в 18:09)
 

Спасибо)
А куда в for() поставить точку с запятой?
syntax error, unexpected ')', expecting ';' 

  Ответить  
 
 автор: Trianon   (09.12.2009 в 18:45)   письмо автору
 
   для: steiger   (09.12.2009 в 18:40)
 

пардон.
Вместо запятой, конечно же.
<?php

$sql 
"
SELECT e.id_event,e.e_title,  p.id_photo
  FROM events AS e
    LEFT JOIN events_photos AS p ON p.event_id=e.id_event 
  ORDER BY e.e_title, e.id_event, p.id_photo
"
;

$res mysql_query($sql) or exit("Error in $sql : ".mysql_error());
for(
$lastid null$row mysql_fetch_assoc($res); )
{
  
$id_event $row['id_event'];
  
$e_title $row['e_title'];
  
$id_photo $row['id_photo'];
  if(
$lastid !== $id_event)
  {
    echo 
"<hr/> Событие $id_event ($e_title)";
    
$lastid $id_event;
  }
  echo 
"<br/> Фото  <img src=$id_photo.gif />";
}

  Ответить  
 
 автор: steiger   (09.12.2009 в 19:25)   письмо автору
 
   для: Trianon   (09.12.2009 в 18:45)
 

Спасибо огромное!
Разобрался.

  Ответить  
Rambler's Top100
вверх

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