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

Форум MySQL

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

 

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

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

тема: Вывод данных с двух таблиц
 
 автор: restall   (04.12.2009 в 20:32)   письмо автору
 
 

Есть три таблицы:


CREATE TABLE `images` (
  `id` int(11) NOT NULL auto_increment,
  `title` text NOT NULL,
  `image` text NOT NULL,
  `date` datetime NOT NULL,
  UNIQUE KEY `id` (`id`)
);


CREATE TABLE `news` (
  `id` int(11) NOT NULL auto_increment,
  `title` text NOT NULL,
  `text` text NOT NULL,
  `date` datetime NOT NULL,
  UNIQUE KEY `id` (`id`)
);


CREATE TABLE `comments` (
  `id` int(11) NOT NULL auto_increment,
  `id_table` int(11) default NULL,
  `table_name` text,
  `id_user` int(11) NOT NULL,
  `text` text NOT NULL,
  `date` datetime NOT NULL,
  UNIQUE KEY `id` (`id`)
) ;



Проблема в том, что нужно вывести последние комментарии, учитывая, что комментарии могут быть и к фото, и к новостям. Отсортировать по дате, и еще сделать постраничную навигацию. Как это все вместить в один запрос?

  Ответить  
 
 автор: Trianon   (04.12.2009 в 21:00)   письмо автору
 
   для: restall   (04.12.2009 в 20:32)
 

`id_table` это ключ из какой таблицы?

`table_name` text, -- это что?
метаданным в строках таблиц не место.

Более правильно сделать чужие ключи id_news INT(11) NULL и id_image INT(11) NULL и заполнять их соответственно.

  Ответить  
 
 автор: restall   (04.12.2009 в 21:33)   письмо автору
 
   для: Trianon   (04.12.2009 в 21:00)
 

id_table - это или id с таблицы news, или id с image.
table_name хранит запись news или image соответственно.

  Ответить  
 
 автор: Trianon   (04.12.2009 в 21:45)   письмо автору
 
   для: restall   (04.12.2009 в 21:33)
 

Чужой ключ не может быть или/или. Чужой ключ строится по первичному ключу конкретной таблицы.
Имена таблиц в записях не хранят. Это метаданные.

  Ответить  
 
 автор: restall   (04.12.2009 в 22:00)   письмо автору
 
   для: Trianon   (04.12.2009 в 21:45)
 

Вы предлагаете хранить в таблице comments два поля для id_news ну и id_images, не используя название таблицы (table_name). Но это было сделано умышлено, тк комментарии прикручены не только для этих таблиц, а и для других. Выходит, что для каждой таблицы нужно создавать в comments новое поле с id_новой_таблицы?

  Ответить  
 
 автор: Trianon   (04.12.2009 в 22:25)   письмо автору
 
   для: restall   (04.12.2009 в 22:00)
 

Выходит.

Если есть приниципиальная необходимость комментарии к разным сущностям держать в одной таблице, то да.

  Ответить  
 
 автор: restall   (05.12.2009 в 11:28)   письмо автору
 
   для: Trianon   (04.12.2009 в 22:25)
 

Ну в моем случае, таких таблиц штук 5.
Так вы не поможете составить правильный запрос?

  Ответить  
 
 автор: Trianon   (05.12.2009 в 11:52)   письмо автору
 
   для: restall   (05.12.2009 в 11:28)
 

Запрос-то в чем? Комментарии вывести?
SELECT * FROM comments ORDER BY `date` DESC LIMIT по вкусу. 

  Ответить  
 
 автор: restall   (05.12.2009 в 16:58)   письмо автору
 
   для: Trianon   (05.12.2009 в 11:52)
 

Этот запрос делает выборку по последним комментариям с новостей:


SELECT t1.title as title, t2.date as date FROM news as t1, comments as t2 WHERE t1.id = t2.id_table AND table_name = 'news' ORDER by t2.date LIMIT 10


такой же для выборки названий картинок к которым добавлены комментарии:


SELECT t1.title as title, t2.date as date FROM images as t1, comments as t2 WHERE t1.id = t2.id_table AND table_name = 'images' ORDER by t2.date LIMIT 10


конечно, я могу объединить их UNION - ом, но тогда я не сделаю сортировку другую, и постраничную навигацию... А нужно одним запросом все вывести. Как решить проблему?

Можно это сделать двумя запросами, вывести в массивы, объединить их и потом делать сортировку... но я считаю, что это не рационально... ведь должно быть решение попроще...

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

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