Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Добрый день.
Есть (к примеру) три таблицы (text, aplication, image).
Каждая из них имеет разную структуру, а также два схожим столбца - это `id` и `title`.
id title mime size countd_download (таблица aplication)
id title mime width height (таблица image)
id title date text avtor (таблица text)
Как сделать запрос к этим трем таблицам, что выбрать все общие и уникальные столбцы и заполнить их данными.
Если в строке существует значение Width - то поле заполняется, если нет пишет NULL.
Составил такой запрос:
Отредактированно MySQL-progress (05.12.2010 16:46:51)
Неактивен
Скорее всего, в других таблицах нет данных с соответствующими id и title.
Ну и вложенного файла нет )
Неактивен
Вот, это sql-содержимое (которое тестирую).
-- phpMyAdmin SQL Dump
-- version 3.3.8
-- http://www.phpmyadmin.net
--
-- Хост: localhost
-- Время создания: Дек 05 2010 г., 16:35
-- Версия сервера: 5.1.40
-- Версия PHP: 5.3.3
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
--
-- База данных: `test`
--
-- --------------------------------------------------------
--
-- Структура таблицы `aplication`
--
CREATE TABLE IF NOT EXISTS `aplication` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` char(64) NOT NULL,
`mime` char(32) NOT NULL,
`size` int(11) NOT NULL,
`countd_download` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=3 ;
--
-- Дамп данных таблицы `aplication`
--
INSERT INTO `aplication` (`id`, `title`, `mime`, `size`, `countd_download`) VALUES
(1, 'Презентация', 'xls', 303021, 4),
(2, 'Буклет - реклама', 'ppt', 49593, 92);
-- --------------------------------------------------------
--
-- Структура таблицы `image`
--
CREATE TABLE IF NOT EXISTS `image` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` char(64) NOT NULL,
`mime` char(32) NOT NULL,
`width` int(11) NOT NULL,
`height` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=3 ;
--
-- Дамп данных таблицы `image`
--
INSERT INTO `image` (`id`, `title`, `mime`, `width`, `height`) VALUES
(1, 'На берегу волги', 'jpg', 100, 40),
(2, 'Гавань - порт', 'gif', 200, 200);
-- --------------------------------------------------------
--
-- Структура таблицы `text`
--
CREATE TABLE IF NOT EXISTS `text` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` char(64) NOT NULL,
`date` date NOT NULL,
`text` text NOT NULL,
`avtor` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=3 ;
--
-- Дамп данных таблицы `text`
--
INSERT INTO `text` (`id`, `title`, `date`, `text`, `avtor`) VALUES
(1, 'Заметки о хождениях', '2010-12-17', 'Познакомьтесь с возможностями', 0),
(2, 'Справка Моя', '2002-12-13', 'Получить эту информацию', 5);
Отредактированно MySQL-progress (05.12.2010 17:43:58)
Неактивен
paulus написал:
Скорее всего, в других таблицах нет данных с соответствующими id и title.
Ну и вложенного файла нет )
Каждая из таблиц заполненна данными.
Надо, что бы все это выводилось друг за другом.
Отредактированно MySQL-progress (05.12.2010 17:46:39)
Неактивен
В приведенном вами дампе видно, что "в других таблицах нет данных с соответствующими id и title."
Поэтому запрос и выводит только данные из таблицы `text`.
Видимо вам нужно, что-то иное, но что не понятно. Напишите какой результат запроса вы хотите получить для этих данных.
Неактивен
Решил нарисовать суть проблемы картинкой.
Она во вложенном файле.
Неактивен
SELECT id, title, поля первой таблицы, NULL, NULL, ... (в количестве полей второй таблицы и третьей таблицы) FROM table1
UNION
SELECT id, title, NULL, ..., NULL, поля второй таблицы, NULL, ...
UNION
...
Смысла в этом никакого. Лучше сделайте три отдельных запроса.
Неактивен
Одним запросом никак.
Если вам нужна новая таблица, то сначала создаете её с помощью create table, затем заполняете
insert into `новая таблица` select * from `image`;
insert into `новая таблица` select * from `text`; и т.д.
Если нужна просто выборка, то делаете запрос вида:
Неактивен
Спасибо.
Тестирую.
Неактивен
Уверен, что самым правильным ответом является
paulus написал:
Смысла в этом никакого. Лучше сделайте три отдельных запроса.
Зачем вам нужна такая схема?
Неактивен
Есть несколько типов данных:
image, text, audio, aplication, video.
На каждый из типов данных ведется таблица.
И для нужной папки выбиаются нужные файлы, где под каждый файл деляется SELECT для получения информации о файле в папке.
Неактивен
Не понял о каких "папках" и "файлах" говорится в последнем предложении.
И по прежнему актуален вопрос - почему не сделать несколько разных запросов?
Неактивен
Мне необходимо о каждом типе файлов сохранять уникальную информацию.
Для видео - это продолжительность, качество и т.д.
Для текста - это сам текст, его автор, дата публикации.
Для картинки - ее размер, ширина, высота.
Общее для всех это "название документа", и его "id" и id-папки, в которой расположен документ.
После все эти данные выводятся в конкретную папку.
Необходимо производить сортиовку для всех файлов в папке.
Делать ограничение на вывод.
Если сделать несколько запросов, то работа с LIMIT, ORDER будет вестись к конкретной таблице.
Но не к сумарной. И я не смогу управлять выводом содержимого папки.
Неактивен
Сделайте просто CONCAT всего мусора о файле в одну строку, и выводите ее?
Неактивен
Как это сделать?
Что-то вроде SELECT `id`, `title`, CONCAT(`mime`, ':', `size` ) FROM `aplication`?
И тогда уже не смогу отсортировать обобщенный результат по полям, задейстованным в CONCAT.
Или как?
Отредактированно MySQL-progress (06.12.2010 17:24:52)
Неактивен
SELECT `id`, `title`, CONCAT(`mime`, ':', `size` ) FROM `aplication`
UNION
SELECT `id`, `title`, CONCAT(`width`, ':', `mime` ) FROM `image`
UNION
SELECT `id`, `title`, CONCAT(`avtor`, ':', `text` ) FROM `text`
Неактивен
Да, как-то так. Отсортировать Вы в любом случае не сможете, т.к. UNION. Его
можно сортировать только целиком.
Неактивен
Страниц: 1