Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Составить правильно запрос

Доброе время суток! В организации в которой я работаю есть электронная очередь компании ДАМАСК. Сервер всё хранит в БД Access. Там есть такая таблица process формат такой: ДатаВремя(2015-05-01 10:52:15) , номерБилета(20150501_00001), событие(число), и прочие не имеющие отношение к вопросу.

Выглядит примерно так:
"2015-05-01 10:52:15" "20150501_00001" "14" ...
"2015-05-01 11:08:34" "20150501_00001" "2" ...

Событие 14 это начало обслуживания, событие 2 это конец обслуживания
Задача состоит в том чтобы ЗАПРОСОМ подсчитать число билетов, обслуживание которых заняло меньше 15 минут
Ну или хотя-бы вывести в виде таблицы:
номер_билета начало обслуживания конец обслуживания

Спасибо за помощь.
Ответ:
GenVick
Составить правильно запрос

В данной задаче использование
DateDiff("n", начало_обслуживания, конец_обслуживания)<15
будет приводить к неточности результатов запроса. Например,
начало_обслуживания=#05/01/2015 10:40:59#
конец_обслуживания=#05/01/2015 10:55:00#
?DateDiff("n",начало_обслуживания,конец_обслуживания)
  15

хотя интервал времени между начало_обслуживания и конец_обслуживания составляет 14 мин 01 сек.

Поэтому здесь нужно использовать или
DateDiff("s", начало_обслуживания, конец_обслуживания)<900
или
DateAdd("n", 15, начало_обслуживания)>конец_обслуживания
Вопрос: Помогите составить сложный запрос

table
-----------
id
status
action
case_number
readiness_date

table1
-----------
id
mid // id- table
executor //INT
kilometrage
departure_date
survey_date

table2
-----------
id
mid // id- table
executor //INT
kilometrage
departure_date
survey_date

accounts
-----------
id
mid // id- table
account_num
account_sum

paid
-----------
id
mid // id- table
aid // id- accounts
executor //INT
exec_sum
exec_date

Нужно выбрать данные из:
table.status, table.action, table.case_number, table.readiness_date, table1.kilometrage, table2.kilometrage, accounts.account_num, accounts.account_sum, paid.exec_sum, paid.exec_date

где 
accounts.mid = table.id, 
table1.mid = table.id, table1.executor = $_POST[idexecutor] AND (table1.departure_date >= $_POST[range_date1] AND table1.departure_date <= $_POST[range_date2]) OR (table1.survey_date >= $_POST[range_date1] AND table1.survey_date <= $_POST[range_date2])
table2.mid = table.id, table2.executor = $_POST[idexecutor] AND (table2.departure_date >= $_POST[range_date1] AND table2.departure_date <= $_POST[range_date2]) OR (table2.survey_date >= $_POST[range_date1] AND table2.survey_date <= $_POST[range_date2])
paid.mid = table.id, paid.aid = accounts.id

Еще и сумму подбить по paid.exec_sum и accounts.account_sum

т.е. нужно выбрать данные где встречается определенный исполнитель (idexecutor) и события (departure_date,survey_date) попадают в в период между датами (range_date1,range_date2)
Несколько дней бьюсь ничего не получается. 
Помогите пожалуйста составить правильно запрос
Ответ:
Я здесь описал их кратко (table1 и table2), в реале они действительно почти индентичны, в них записываются данные людей двух категорий и часть полей отличается или отсутствует.

Есть главная таблица (условно) table, с ней связаны таблицы table1 и table2, а также accounts с связанная с ней paid (aid), в paid  присутствует mid (id главной) т.к. иногда нужно выводить данные в связке (table-paid).
Согласен что напахано, сильно не пинайте, опыта проектирования большой базы и сложных запросов нет.
Вопрос: Не могу составить два запроса.

Здравствуйте, можете мне помочь составить два запроса?
1. как мне взять значение из таблицы user_personal в колонке name по айдишнику и вставить а другую таблицу?
2. Как мне проверить два колонки (id и user_id) есть ли значения этих ячеек в одной строке или нет?
Ответ:
artik12321
Здравствуйте, можете мне помочь составить два запроса?
1. как мне взять значение из таблицы user_personal в колонке name по айдишнику и вставить а другую таблицу?
2. Как мне проверить два колонки (id и user_id) есть ли значения этих ячеек в одной строке или нет?


update XXXX x
set yyy = ( select name from user_personal where user_id = x.user_id )
where xxx.pk = 42


select * from YYYY
where id is null and user_id is null




УЧИ SQL , или увольняйся!
Вопрос: Помогите оптимизировать и составить правильно запрос

У меня три таблицы.
Таблица заказов (323 записи), таблица работников (1900 записей) и таблица выполненных заказов (58.000 записей).
Мне нужно взять работника, который еще не выполнял заказ и поставить ему задачу.

Запрос выглядит так:

declare @UserName nvarchar(50) = 'victor';
	
	select TOP 1 
	o.Id, 
	va.[Login], 
	o.[OrderType],
	from Orders o, [Accounts] va
	LEFT JOIN Users u
		ON u.UserId = va.UserId
	where 
	va.[IsActive] = 1 
	AND va.IsDeleted = 0
	AND o.IsDone = 0
	AND u.UserName = @UserName
	AND not exists (
		select 1 from OrderEvents oe 
		where 	va.[Login] = oe.Account 
				AND o.[Id] = oe.[OrderId]
	) 

	order by va.[LastActive], o.[LastUpdate]


Этот запрос по профайлеру выгребает 136.000 записей.

Причем без проверки
AND not exists (
		select 1 from OrderEvents oe 
		where 	va.[Login] = oe.Account 
				AND o.[Id] = oe.[OrderId]
				--AND o.[OrderType] = oe.[OrderType]
	)

он выгребает всего 210 записей.

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

Если я правильно понимаю, нужно написать чтото вроде цикла, чтобы отдавало первый заказ и сотрудника, которых нет в таблице и не сверяло дальше.

Или здесь нужен индекс?

Заранее спасибо.
Ответ: @MathewSun планом выполнения поделитесь (*.sqlplan)?
Вопрос: Помогите составить MySQL запрос на выборку из дерева по трём таблицам.

Здравствуйте! Помогите, пожалуйста, правильно составить MySQL запрос на выборку со следующим условием:

Есть три таблицы:
1. TStructure (FID:INT(11), FIDparent:INT(11), FOtdelName:VARCHAR(32)) – хранит дерево структуры предприятия (FID-FIDparent),

2. TUsers (FID:INT(11), FIDstructure:INT(11), FUserName:VARCHAR(64)) – хранит пользователей, принадлежащих какому либо отделу предприятия методом TUsers.FIDstructure=TStructure.FID,

3. TReports (FID:INT(11), FIDStructrueOtdel:INT(11), FReport:VARCHAR(255)) – таблица с отчётами, принадлежащими какому либо отделу предприятия методом TReports.FIDStructrueOtdel=TStructure.FID.

TUsers.FIDstructure заранее известен. TReports.FIDStructrueOtdel может совпадать, а может и не совпадать с TUsers.FIDstructure, т.к. первый может указывать, в том числе, и на дочерние отделы, к которым пользователь не принадлежит на прямую, а только через родительское отношение в дереве TStructure. Составьте или помогите составить SELECT запрос так, чтобы получить все записи из таблицы TReports, принадлежащие и дочерние отделу, к которому относится пользователь (TUsers.FIDstructure).

P.S.: Не судите строго, первый раз прошу так в наглую, но заработался до того, что совсем отупел, думать больше не могу, еле пост написал, не спал 35 часов и времени отоспаться не дают. Помогите, пожалуйста, составьте для меня этот запрос.
Ответ: как то так
SELECT * FROM TReports r
JOIN (SELECT @index:=INSTR(@a,',') as coma_index,
@id:=SUBSTRING_INDEX(@a, ',', 1)  as id,
@a:=SUBSTRING(@a,IF(@index,@index+1,0)),
@a:=CONCAT_WS(IF(LENGTH(@a)>0,',',''),@a,(SELECT group_concat(FID) FROM TStructure WHERE FIDparent=@id)) as array
FROM TStructure,(SELECT @a:=${FIDstructure_Param}) as init
WHERE LENGTH(@a)>0) as m ON r.FIDStructrueOtdel=m.id
Вопрос: Помогите составить рекурсивный запрос

Коллеги, помогите составить рекурсивный запрос.
Про рекурсивные CTE, конечно, читал, но составить запрос не могу. Просто не умею мыслить такими категориями.
Нужен пример и всё такое.

Есть таблица:
CREATE TABLE parent_child (
	[N] [int] IDENTITY(1,1) NOT NULL,
	[parent_id] [varchar](10) NOT NULL,
	[parent_rng] [int] NOT NULL,
	[child_id] [varchar](10) NOT NULL,
	[child_rng] [int] NOT NULL,
PRIMARY KEY CLUSTERED 
(
	[parent_id] ASC,
	[child_id] ASC,
	[N] ASC
))

INSERT INTO [parent_child]([parent_id],[parent_rng],[child_id],[child_rng]) VALUES('_1Z00JIJI2',0,'_1Z00JIJI2',0)
INSERT INTO [parent_child]([parent_id],[parent_rng],[child_id],[child_rng]) VALUES('_1Z00JIJI2',0,'_1Z00JIJI2',1)
INSERT INTO [parent_child]([parent_id],[parent_rng],[child_id],[child_rng]) VALUES('_1Z00JIJI2',1,'B1YD13B28O',0)
INSERT INTO [parent_child]([parent_id],[parent_rng],[child_id],[child_rng]) VALUES('B1YD13B28O',0,'B1YD13BVHE',0)
INSERT INTO [parent_child]([parent_id],[parent_rng],[child_id],[child_rng]) VALUES('C2780K704W',0,'C1YD128OPG',0)
INSERT INTO [parent_child]([parent_id],[parent_rng],[child_id],[child_rng]) VALUES('C2780K704W',0,'C1YD12IK1E',0)
INSERT INTO [parent_child]([parent_id],[parent_rng],[child_id],[child_rng]) VALUES('C2780K704W',0,'C2780K704W',0)
INSERT INTO [parent_child]([parent_id],[parent_rng],[child_id],[child_rng]) VALUES('E33W0L3XYY',0,'E1YD12P8FU',0)
INSERT INTO [parent_child]([parent_id],[parent_rng],[child_id],[child_rng]) VALUES('E33W0L3XYY',0,'E1YD12WA3I',0)
INSERT INTO [parent_child]([parent_id],[parent_rng],[child_id],[child_rng]) VALUES('E33W0L3XYY',0,'E1YD1312WY',0)


Пара [parent_id],[parent_rng] и [child_id],[child_rng] - это идентификаторы узлов дерева.

Корни деревьев (их множество) это узлы, в которых [parent_id]=[child_id] and [parent_rng]=[child_rng], т.е. одинаковые значения в parent и child половинках.
Дочерние узлы содержат значения [parent_id],[parent_rng] родительского узла, и [child_id],[child_rng] - своего.
Например:
('_1Z00JIJI2',0,'_1Z00JIJI2',0) - корневой узел
('_1Z00JIJI2',0,'_1Z00JIJI2',1) - дочерний
('_1Z00JIJI2',1,'B1YD13B28O',0) - "внучатый"
И т.д., вложенность около 1000

Задача:
Раскрыть дерево в таблицу "общий предок" - "текущий узел".
Т.е. должно быть:

('_1Z00JIJI2',0,'_1Z00JIJI2',0)
('_1Z00JIJI2',0,'_1Z00JIJI2',1)
('_1Z00JIJI2',0,'B1YD13B28O',0)

Я знаю, что это просто. Но не могу уложить это в голове.
Помогите!
Ответ:
uaggster
Только я всё равно не могу понять, как оно работает!
Вопрос: Составить sql запрос на добавление в начало поля дополнительное значение

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

Есть таблица qq_redirection, в таблице примерно 20000 записей, у каждой записи есть поле oldurl и в это поле, к каждой записи нужно добавить в начало catalog/
Т.е если в oldurl сейчас FR_2314/AAAA , то нужно чтобы получилось catalog/FR_2314/AAAA

Как можно данную задачу реализовать? Заранее спасибо!
Ответ: Lumix, Благодарствую
Вопрос: Нужно составить SQL запрос

1. Есть таблица pa_trans
2. В ней есть столбец с выводом status
3. У status по умолчанию стоит value 'new' для новых строк
4. В ручную можно изменить value 'new' на 'done'
5. Как автоматически переключить value с 'new' на 'done' для имеющихся строк чтобы не обрабатывать каждую строчку руками?

Помогите составить SQL запрос, никак не получается.
Ответ:
MySQL
1
UPDATE pa_trans SET status = 'done' WHERE 1
а может вообще без WHERE

Добавлено через 1 минуту
ну а вообще если в phpmyadmin изменить одну строчку, то сама команда вверху появится. хотя бы так учитесь чтоли...
Вопрос: Помогите составить MYSQL запрос из 2 таблиц

Помогите составить MYSQL запрос из 2 таблиц
Есть 2 таблицы:

Товары
----------------
id    | название
----------------
1     | огурцы
2     | помидоры
3     | морковка
4     | капуста

Свойства
------------------------
id товара | тип   | значение
------------------------
2         | вес   | 1200
2         | цвет  | красный
3         | вес   | 500
4         | вес   | 1200

Необходимо, например: получить список тораров, у которых "вес = 1200" и "цвет = красный".
Т.е. результатом должно быть:

----------------
id    | название
----------------
2     | помидоры
Ответ:
Код

SELECT t1.id, t1.name
FROM Goods t1, Properties t2
WHERE t1.id = t2.id
AND (t2.type, t2.value) IN (('вес','1200'),('цвет','красный'))
GROUP BY t1.id /* , t1.name */
HAVING COUNT(/* DISTINCT t2.type, t2.value */ *) = 2

Вопрос: составить SQL запрос

Добрый день!

Может немного не в ту ветку, подходящую по заголовкам тем не нашел.

Помогите, плиз, составить SQL запрос, что-то торможу уже пару часов.

Самый простой пример, имеется таблица из трех полей:
ITEM_CODE NUMBER
DT TIMESTAMP
VALUE NUMBER

Из этой таблицы нужно выбрать самые последние (по дате DT) записи для каждого ITEM_CODE.
т.е. что-то вроде

SELECT DISTINCT ITEM_CODE, MAX(DT), VALUE FROM TABLE1 GROUP BY ITEM_CODE, VALUE OREDER BY ITEM_CODE

Проблема в том, что DISTINCT работает одновременно для всех полей, а мне нужно только для ITEM_CODE. Т.е. двух записей с одинаковым ITEM_CODE в выходном наборе быть не должно.
Ответ: Naf,

Спасибо! Работает чудно! :)