Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: Базы данных MySQL

  Все выпуски  

RFpro.ru: Базы данных MySQL


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Коцюрбенко Алексей aka Жерар
Статус: Советник
Рейтинг: 4350
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 1994
∙ повысить рейтинг »
vladisslav
Статус: Практикант
Рейтинг: 1353
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Базы данных / MySQL

Номер выпуска:478
Дата выхода:12.06.2012, 23:30
Администратор рассылки:Абаянцев Юрий Леонидович aka Ayl (Профессионал)
Подписчиков / экспертов:138 / 64
Вопросов / ответов:3 / 11

Консультация # 39649: Вот есть например база, где имеется поле время (timest_). Как выбрать, например, ровно 100 записей в порядке убывания, где их поле timest_ меньше заданного значения? (В идеале, чтоб не пропустить ни одной записи между записями с минимальным значением времени (100-я запись на выходе) и максимальным, которое задано). P. S. БД - MS Access. P. ...


Консультация # 39886: Скажите ,пожалуйста, есть ли в SQL оператор типа IF или, что еще лучше CASE. Мне нужно написать запрос, в котором в зависимости от значения поля это значение умножалось на разные числа....
Консультация # 73510: В продолжении вопроса №73486 хочу задать вопросы далее. Возможно они глупые возможно наивные или же что-то еще. Но я пишу базу данных под маленькую поисковую систему. и у меня встал влпрос как объеденить в запросе несколько таблиц. дам пример из трех таблиц (см приложение). я взял учебник Поля Дюбуа, но не совсем понял как объеденять таблиц...

Консультация # 39649:

Вот есть например база, где имеется поле время (timest_). Как выбрать, например, ровно 100 записей в порядке убывания, где их поле timest_ меньше заданного значения? (В идеале, чтоб не пропустить ни одной записи между записями с минимальным значением времени (100-я запись на выходе) и максимальным, которое задано).
P. S. БД - MS Access.
P. P. S. Индексы не предлагать, т. к. возможны вставки в середину таблицы, и ответы будут неверными, если брать записи типа:
where *
from baza
where (id >=100) and (id <=200)

т. к. id вставленной в середину записи может уже быть 1000.

Спасибо.

Дата отправки: 07.04.2006, 15:25
Вопрос задал: mvp
Всего ответов: 4
Страница онлайн-консультации »


Консультирует Doctor013:

Здравствуйте, mvp!
Для Oracle я бы делал это так:
выборка промежуточных записей из результирующего множества-
select *
from (select a.*, rownum rnum
from (select * from my_table t where t.date_ where rownum <=100 )
where rnum >= 1

Во внутреннем запросе наладываем условие и сортируем по убыванию, следующим позапросом ограничиваем снизу (100 записей), самый верхний в Вашем случае не нужен, я его оставил для примера, если вдруг потребуется вывести записи с 5 до 100 и т.д. В приложении то, что получилось.

Приложение:

Консультировал: Doctor013
Дата отправки: 07.04.2006, 15:49
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Kazakh:

Здравствуйте, mvp!
В Аксесе замечательный диалект SQL.
Вот решение для вашей проблемы. Этот запрос выведет 100 записей удовлетворяющих условиям. ):
SELECT TOP 100 *
FROM "Ваша таблица"
WHERE timest_>"Ваше значение"

Вместо TOP 100 можно использовать %
То есть, TOP 10% выведет только 10 % всех записей.

Консультировал: Kazakh
Дата отправки: 07.04.2006, 15:55
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Игорь Елизаров (Студент):

Здравствуйте, mvp!

выбираем из таблицы table_1 100 записей у которых значение поля timest меньше заданного и сортируем выборку по этому полю
на SQL этот запрос выглядит так:
select top 100 * from table_1 where timest <@datatime
order by timest

В MS Access аналогично. то есть тут Top 100 задает количество возвращаемых записей.

С уважением, Игорь

Консультировал: Игорь Елизаров (Студент)
Дата отправки: 07.04.2006, 18:11
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Архангельский Андрей Германови:

Здравствуйте, mvp!
В MS Access - никак
В Firebird достаточно написать

Select first 100 * from Table order by Timest desc

Консультировал: Архангельский Андрей Германови
Дата отправки: 07.04.2006, 19:20
Рейтинг ответа:

НЕ одобряю 0 одобряю!

Консультация # 39886:

Скажите ,пожалуйста, есть ли в SQL оператор типа IF или, что еще лучше CASE. Мне нужно написать запрос, в котором в зависимости от значения поля это значение умножалось на разные числа.

Дата отправки: 10.04.2006, 13:26
Вопрос задал: TTT
Всего ответов: 4
Страница онлайн-консультации »


Консультирует Архангельский Андрей Германови:

Здравствуйте, TTT!

В SQL-99 есть операторы Case и IF, но не все СУБД их поддерживают
Подробное описание смотри в Мартина Грабера "SQL" изд.Лори 2001г

Однако мне кажется, что усложнение запроса этими операторами приведет к скрытым и сложно обнаруживаемым ошибкам

Консультировал: Архангельский Андрей Германови
Дата отправки: 10.04.2006, 13:37
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Straight (Практикант):

Здравствуйте, TTT!
Есть и IF. Есть и CASE.
http://www.mysql.ru/docs/man/Control_flow_functions.html

Консультировал: Straight (Практикант)
Дата отправки: 10.04.2006, 15:03
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Jadd:

Здравствуйте, TTT!
Есть оба оператора и ни к каким ошибкам это не приведет, не слушай всякие необоснованные "ужастики". Все легко отлаживается. Успехов.

Консультировал: Jadd
Дата отправки: 10.04.2006, 16:52
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Игорь Елизаров (Студент):

Здравствуйте, TTT!
конечно, в SQL есть оба эти оператора.
Оператор Case используется только внутри конструкции Select
а оператор If можно использовать и в хранимых процедурах

Пример оператора case

Select (case when @t=1 then \'единица\'
when @t = 2 then \'двойка\'
else \'хорошая оценка\' end ) as return

Консультировал: Игорь Елизаров (Студент)
Дата отправки: 11.04.2006, 00:04
Рейтинг ответа:

НЕ одобряю 0 одобряю!

Консультация # 73510:

В продолжении вопроса №73486 хочу задать вопросы далее.
Возможно они глупые возможно наивные или же что-то еще. Но я пишу базу данных под маленькую поисковую систему. и у меня встал влпрос как объеденить в запросе несколько таблиц.
дам пример из трех таблиц (см приложение). я взял учебник Поля Дюбуа, но не совсем понял как объеденять таблицы, если не пользовать одинковые имена. Мне надо что бы при вводе той же фамилии, или же имени, а может номера предприятие база данных вывела мне всю информацию. Три базы содержат имя, фамилию, и идентификатор,
вторая база содержит название предприятия и период работы,
а треться содержит школу в котором учился искомый объект.
Возможно я чего-то глупо недопонимаю. Хотелось бы узнать алгоритм "связывания" одно базы с другими, тремя, пятью, да сколько угодно. Заранее благодарю и извиняюсь, если некорреткно поставлен вопрос.

Дата отправки: 31.01.2007, 18:49
Вопрос задал: Чинга
Всего ответов: 3
Страница онлайн-консультации »


Консультирует Архангельский Андрей Германови:

Здравствуйте, Чинга!

ВАриантов здесь очень много и коротко не ответишь.
Наверное лучше почитать книгу Мартина Грабера "Введение в SQL" (изд.Лори). (другое название "Понимание SQL"
Именно эту первую книгу, так как в ней очень просто и понятно разьяснены эти вопросы без лишней информации по различным стандартам.

Можно также посмотреть описание оператора Select
http://www.az-design.ru/Support/DataBase/SQL/SQL92/SQL92-2Select.shtml

Консультировал: Архангельский Андрей Германови
Дата отправки: 31.01.2007, 18:59
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Heartwork:

Здравствуйте, Чинга! Хорошо бы создать четвертую таблицу, создать в ней поля идентичные ключам (Primary Key) для первых трех таблиц, расположить в каждой строке номера ключей (т.н. внешние ключи), соответствующие записям из первых таблиц, тогда данные будут правильно реляционно связаны.
Например, строка из первой таблицы Names
Name Family LastName Id_Fam
-----------------------------------------
Вася Иванович Пупкин 1

строка из второй таблицы Jobs

Predpriyatie PeriodRaboty Gorod_Rab Id_Predpr
--------------------------------------------------------------
Beeline 2 Moscow 4

Строка из третьей таблицы Schools
_
NomerSchool GorodUcheby VremyaUcheby Id_School
-------------------------------------------------------------------
150 Moscow 11 3

Для таких данных строка из связывающей все эти три таблицы четвертой таблицы (назовем её CommonTable)
будет иметь вид

Id_Fam Id_Work Id_School
------------------------------------------
1 4 3

А данные (например, об имени, фамилии, месте работы и номере школы) поможет выбрать вот такой запрос, использующий внутреннее связывание (ключевая фраза INNER JOIN) этих таблиц по ключам:

SELECT Names.Name, Names.LastName, Jobs.Predpriyatie, Schools.NomerSchool
FROM CommonTable
INNER JOIN Names ON Names.Id_Fam = CommonTable.Id_Fam
INNER JOIN Jobs ON Jobs.Id_Predpr = CommonTable.Id_Work
INNER JOIN Schools ON Schools.Id_School = CommonTable.Id_School

Мог ошибиться в написании имен полей, но в целом примерно так.

Консультировал: Heartwork
Дата отправки: 31.01.2007, 19:27
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Grigory:

Здравствуйте, Чинга!
Вот, что пишет по этому поводу Александр Дворжецкий в своей книжке "Руководство пользователя SQL":
Соединения - это подмножества декартова произведения. Так как декартово произведение n таблиц - это таблица, содержащая все возможные строки r, такие, что r является сцеплением какой-либо строки из первой таблицы, строки из второй таблицы,... и строки из n-ой таблицы, то осталось лишь выяснить, можно ли с помощью SELECT получить декартово произведение. Для получения декартова произведения надо указать во фразе FROM перечень перемножаемых таблиц, а во фразе SELECT - все их столбцы.
Если из декартова произведения убрать ненужные строки и столбцы, то можно получить актуальные таблицы, соответствующие любому из соединений.
Очевидно, что отбор актуальных строк обеспечивается вводом в запрос WHERE фразы, в которой устанавливается соответствие между:

кодами трапез (Т) в таблицах Меню и Трапезы (Меню.Т = Трапезы.Т)
кодами видов блюд (В) в таблицах Меню и Вид_блюд (Меню.В = Вид_блюд.В)
номерами блюд (БЛ) в таблицах Меню и Блюда (Меню.БЛ = Блюда.БЛ)

такой скорректированный запрос:
Select Меню.*, Трапезы.*,Вид_блюд.*,Блюда.*
FROM Меню,Трапезы,Вид_блюд,Блюда
WHERE Меню.Т = Трапезы.Т AND
Меню.В = Вид_блюд.В AND
Меню.БЛ = Блюда.БЛ

Надеюсь, этот пример Вам поможет разобраться.

Удачи!

Григорий

Консультировал: Grigory
Дата отправки: 31.01.2007, 20:18
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!



В избранное