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

Форум MySQL

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

 

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

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

тема: Сложный SQL запрос
 
 автор: Jura   (07.10.2005 в 01:54)   письмо автору
 
 

Люди, подскажите пожалуйста как лучше всего реализовать в одном запросе следующее.
Есть база данных MYSQL, есть 3 таблицы (таблица наименований, таблица описаний, таблица информации).
Дерево скрещивания информации:
наименование -> информация -> описание

Важно помнить информация сортируется по времени и зависит от момента времени подачи запроса на генерацию всей информации.

У меня реализован немного неудобный механизм, хотелось бы более рациональное решение найти. Помогите пожалуйста.


---------------------------------------------------------------------------- таблица наименований
код_наим | наименование
1 | nameC_1
2 | nameC_2
3 | nameC_3
...
-------------------------------------------------------------------------------------------------


------------------------------------------------------------------------------ Таблица информации
код_инф | время | код_наим | текст_информации
1 | 2005-10-03 06-06-33 | 1 | текст 1
2 | 2005-10-03 06-06-34 | 1 | текст 2
3 | 2005-10-03 06-07-34 | 1 | текст 3
4 | 2005-10-03 08-20-34 | 2 | текст 4
5 | 2005-10-03 08-25-34 | 1 | текст 5
6 | 2005-10-03 06-06-30 | 3 | текст 6
7 | 2005-10-03 06-06-34 | 1 | текст 7

-------------------------------------------------------------------------------------------------


---------------------------------------------------------------------------- таблица описаний
код_описания | описание
1 | opisanie1
2 | opisanie2
3 | opisanie3
...
-------------------------------------------------------------------------------------------------



Теперь что требуется получить.
Состояние информации за определенный промежуток времени, причем так, чтобы наименования употреблялись только один раз, т.е.
в таблице наименований есть наименование с кодом=1

промежуток заранее задан к примеру 2005-10-03 06-00-00 2005-10-03 06-50-00
В него попадает информаци, относящаяся к информации 1 и 3
Но результат должен быть такой (обратная сортировка - последнее значение сверху)

nameC_1 | 2005-10-03 06-07-34 | текст 3 | пояснение из 3 таблицы...
nameC_3 | 2005-10-03 06-06-30 | текст 6 | пояснение из 3 таблицы...


В настоящее время эта таблица содержит около 50 000 строк, поэтому время генерации результата очень важно, каждая секунда дорога.

В настоящее время мой php скрипт в цикле просматривает все наименования. Внутри этого цикла еще цикл просмотра значений из второй таблицы и 3-ей соответственно.
В итоге проходов получается количество наименований * на количество информации.

Хотелось бы найти решение за один проход, и экономия времени генерации была бы обеспечена.
Помогите.......... Пожалуйста.
Очень надо.
я пытался склеить запросы, но оператора склейки запроса увы.... не нашел Это первая причина обращения сюда, во вторых, может кто-то с таким же уже сталкивался.


ХЕЛП.

   
 
 автор: cheops   (07.10.2005 в 02:37)   письмо автору
 
   для: Jura   (07.10.2005 в 01:54)
 

А версия MySQL какая: ниже или выше 4.1?

   
 
 автор: Jura   (07.10.2005 в 09:59)   письмо автору
 
   для: cheops   (07.10.2005 в 02:37)
 

MYSQL 4.1.7

   
 
 автор: cheops   (07.10.2005 в 15:52)   письмо автору
 
   для: Jura   (07.10.2005 в 09:59)
 

А таблица описания как связана с таблицей информации (как сопоставляются записи этих таблиц друг с другом) - или таблица описания вообще не используется?

   
 
 автор: Jura   (08.10.2005 в 02:05)   письмо автору
 
   для: cheops   (07.10.2005 в 15:52)
 

---------------------------------------------------------------------------- таблица описаний
код_описания | описание | код_информации
1 | opisanie1 | код_информации
2 | opisanie2 | код_информации
3 | opisanie3 | код_информации
...
-------------------------------------------------------------------------------------------------
Забыл последнюю колонку добавить с кодом инфы.

Но это в принципе не очень существенно, вторая и третья связываются легко, а вот выборка - проблема.

Есть мысли? как за один проход? все это реализовать?
Очень нужно. горю.

   
 
 автор: cheops   (08.10.2005 в 02:25)   письмо автору
 
   для: Jura   (08.10.2005 в 02:05)
 

Каким полями связаны вторая и третья таблицы? Какое поле одной таблицы эквивалентно полю другой таблицы?

   
 
 автор: Jura   (08.10.2005 в 11:31)   письмо автору
 
   для: cheops   (08.10.2005 в 02:25)
 

"код_инф" одно и тоже в третьей таблице "код_информации"

   
 
 автор: napTu3aH   (08.10.2005 в 12:29)   письмо автору
 
   для: Jura   (08.10.2005 в 11:31)
 

С запросом могу помочь, только в нем нет выборки по дате(я с интервалами еще не до конца разобрался), думаю Хеопс подскажет :-)

SELECT tbl_name.name AS name,
tbl_info.data AS data,
tbl_info.text_info AS info,
tbl_about.opisanie AS opisanie
FROM tbl_name, tbl_info, tbl_about
WHERE tbl_name.id = tbl_info.id_name
AND tbl_name.id = tbl_about.id_info

Дальше должна идти выборка по дате, но с ней у меня туговато...

P.S. С названиями таблиц и полей, думаю разберетесь я ваши взял за основу

   
 
 автор: napTu3aH   (08.10.2005 в 12:39)   письмо автору
 
   для: napTu3aH   (08.10.2005 в 12:29)
 

Нашел обходной путь, правда незнаю насколько он правильный, но у меня выдает все правильно :-)

SELECT tbl_name.name AS name, 
tbl_info.data AS data, 
tbl_info.text_info AS info, 
tbl_about.opisanie AS opisanie 
FROM tbl_name, tbl_info, tbl_about 
WHERE tbl_name.id = tbl_info.id_name 
AND tbl_name.id = tbl_about.id_info
AND tbl_info.data > '2005-01-01'
AND tbl_info.data < '2005-10-15'


Даты придумал сам, а вы попробуйте вставить реальные

   
 
 автор: Jura   (08.10.2005 в 13:08)   письмо автору
 
   для: napTu3aH   (08.10.2005 в 12:39)
 

Спасибо, поэкпериментирую.

   
 
 автор: Jura   (08.10.2005 в 15:11)   письмо автору
 
   для: Jura   (08.10.2005 в 13:08)
 

ура, получилось, но несколько иначе!

   
 
 автор: Jura   (08.10.2005 в 15:16)   письмо автору
 
   для: Jura   (08.10.2005 в 15:11)
 


SELECT distinct info.id_names, names.name, count(*),max(info.time), max(info.value) FROM names, info WHERE info.time BETWEEN '2005-10-08 09-00-00' and '2005-10-08 10-28-59' and info.id=names.id GROUP BY info.id order by names.name asc;


Всем спасибо! За верное направление в поиске.

   
Rambler's Top100
вверх

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