|
|
|
| Люди, подскажите пожалуйста как лучше всего реализовать в одном запросе следующее.
Есть база данных 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-ей соответственно.
В итоге проходов получается количество наименований * на количество информации.
Хотелось бы найти решение за один проход, и экономия времени генерации была бы обеспечена.
Помогите.......... Пожалуйста.
Очень надо. я пытался склеить запросы, но оператора склейки запроса увы.... не нашел Это первая причина обращения сюда, во вторых, может кто-то с таким же уже сталкивался.
ХЕЛП. | |
|
|
|
|
|
|
|
для: Jura
(07.10.2005 в 01:54)
| | А версия MySQL какая: ниже или выше 4.1? | |
|
|
|
|
|
|
|
для: cheops
(07.10.2005 в 02:37)
| | MYSQL 4.1.7 | |
|
|
|
|
|
|
|
для: Jura
(07.10.2005 в 09:59)
| | А таблица описания как связана с таблицей информации (как сопоставляются записи этих таблиц друг с другом) - или таблица описания вообще не используется? | |
|
|
|
|
|
|
|
для: cheops
(07.10.2005 в 15:52)
| | ---------------------------------------------------------------------------- таблица описаний
код_описания | описание | код_информации
1 | opisanie1 | код_информации
2 | opisanie2 | код_информации
3 | opisanie3 | код_информации
...
-------------------------------------------------------------------------------------------------
Забыл последнюю колонку добавить с кодом инфы.
Но это в принципе не очень существенно, вторая и третья связываются легко, а вот выборка - проблема.
Есть мысли? как за один проход? все это реализовать?
Очень нужно. горю. | |
|
|
|
|
|
|
|
для: Jura
(08.10.2005 в 02:05)
| | Каким полями связаны вторая и третья таблицы? Какое поле одной таблицы эквивалентно полю другой таблицы? | |
|
|
|
|
|
|
|
для: cheops
(08.10.2005 в 02:25)
| | "код_инф" одно и тоже в третьей таблице "код_информации" | |
|
|
|
|
|
|
|
для: 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: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'
|
Даты придумал сам, а вы попробуйте вставить реальные | |
|
|
|
|
|
|
|
для: napTu3aH
(08.10.2005 в 12:39)
| | Спасибо, поэкпериментирую. | |
|
|
|
|
|
|
|
для: Jura
(08.10.2005 в 13:08)
| | ура, получилось, но несколько иначе! | |
|
|
|
|
|
|
|
для: 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;
|
Всем спасибо! За верное направление в поиске. | |
|
|
|