|
|
|
| Есть три таблицы:
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`)
) ;
|
Проблема в том, что нужно вывести последние комментарии, учитывая, что комментарии могут быть и к фото, и к новостям. Отсортировать по дате, и еще сделать постраничную навигацию. Как это все вместить в один запрос? | |
|
|
|
|
|
|
|
для: restall
(04.12.2009 в 20:32)
| | `id_table` это ключ из какой таблицы?
`table_name` text, -- это что?
метаданным в строках таблиц не место.
Более правильно сделать чужие ключи id_news INT(11) NULL и id_image INT(11) NULL и заполнять их соответственно. | |
|
|
|
|
|
|
|
для: Trianon
(04.12.2009 в 21:00)
| | id_table - это или id с таблицы news, или id с image.
table_name хранит запись news или image соответственно. | |
|
|
|
|
|
|
|
для: restall
(04.12.2009 в 21:33)
| | Чужой ключ не может быть или/или. Чужой ключ строится по первичному ключу конкретной таблицы.
Имена таблиц в записях не хранят. Это метаданные. | |
|
|
|
|
|
|
|
для: Trianon
(04.12.2009 в 21:45)
| | Вы предлагаете хранить в таблице comments два поля для id_news ну и id_images, не используя название таблицы (table_name). Но это было сделано умышлено, тк комментарии прикручены не только для этих таблиц, а и для других. Выходит, что для каждой таблицы нужно создавать в comments новое поле с id_новой_таблицы? | |
|
|
|
|
|
|
|
для: restall
(04.12.2009 в 22:00)
| | Выходит.
Если есть приниципиальная необходимость комментарии к разным сущностям держать в одной таблице, то да. | |
|
|
|
|
|
|
|
для: Trianon
(04.12.2009 в 22:25)
| | Ну в моем случае, таких таблиц штук 5.
Так вы не поможете составить правильный запрос? | |
|
|
|
|
|
|
|
для: restall
(05.12.2009 в 11:28)
| | Запрос-то в чем? Комментарии вывести?
SELECT * FROM comments ORDER BY `date` DESC LIMIT по вкусу.
|
| |
|
|
|
|
|
|
|
для: 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 - ом, но тогда я не сделаю сортировку другую, и постраничную навигацию... А нужно одним запросом все вывести. Как решить проблему?
Можно это сделать двумя запросами, вывести в массивы, объединить их и потом делать сортировку... но я считаю, что это не рационально... ведь должно быть решение попроще... | |
|
|
|