Змінюй хід війни! Допомагай ЗСУ!

Нужен совет по MySQL

🔴 13:27 Повітряна тривога в Харків.обл.
  • 🔴 13:27 Повітряна тривога в Харків.обл.
  • #21
Чем плохая задача для собеседования? Решивший ее покажет не только владение SQL-ем, но и находчивость и умение добиваться результата :)
Как бы я сделал. Т.к. задача далека от практических нужд, то нужно не преумножать сущности и додумывать условия, а просто сделать то, что нужно и ни граммом более. Точечное решение конкретно этой задачи. Возможно? Возможно. Взять, нарезать отдельными запросами требуемые строки хоть по одной через limit, а потом объединить их union-ом. Можно сделать через full outer большую таблицу и вырезать delete все лишнее.

солнце, воздух и вода
это, братцы, ерунда!
лишь здоровый онанизм...

какбе, если испытуемый в самом начале решения этой задачи
не задается вопросом "все ли в порядке с автором?",
гнать его из ИТ поганою метлой.
 
  • 🔴 13:27 Повітряна тривога в Харків.обл.
  • #22

никак, это бред

Владеющий SQL решать ее не станет а покрутит пальцем у виска. Самый лучший в данном случае способ продемонстрировать владение SQL.
+1
Я ненавижу тех идиотов, которые придумывают такие тесты и задачи. Слава богу, как раз благодаря таким умникам не прошел собеседование в один из отделов нашей компании (3 года назад) . Зато сразу после этого прошел в другой, где собственно и работаю :), благо тестовые вопросы были непосредственно по делу и приближенные к реальности и реальным бизнес-задачам
 
  • 🔴 13:27 Повітряна тривога в Харків.обл.
  • #23
Но все же, кто может подсказать как объеденить таблицы В и С не используя ключь. По моему это не реально, любой запрос выдаст не понятную кучу муссора. Да не просто соеденить их, а еще с линейной перестановкой record. В общем я заинтересовался, так кто сможет это сделать, или это ни еому не под силу???
 
  • 🔴 13:27 Повітряна тривога в Харків.обл.
  • #24
  • 🔴 13:27 Повітряна тривога в Харків.обл.
  • #25
если б еще догадаться по какому признаку их надо соединить..
Вот в этом и прикол. Какими способами я только не пробовал - ничего. Тут одна мысль такое решить возможно только при помощи PL/SQL, но не охота заморачиваться (да и сервер еще не ставил на новую винду). Вот и интересно реально вообще решить данную задачу средствами SQL.
 
  • 🔴 13:27 Повітряна тривога в Харків.обл.
  • #26
Останнє редагування:
  • 🔴 13:27 Повітряна тривога в Харків.обл.
  • #27
попробуй хрустальный шар.
может он подскажет, что же автор хотел этим сказать.
))))))))))
о точно, это хороший вариант
 
  • 🔴 13:27 Повітряна тривога в Харків.обл.
  • #28
Код:
SELECT tA.`id`, tA.`nameA`, poeben.`nameB`, poeben.`nameC` FROM tA
LEFT JOIN (
	SELECT tB.`id`, tB.`nameB`, tC.`nameC`
	FROM (
		SELECT `id`, `nameB`, @line1 := IF(`id` = @oldId1, @line1+1, 1) AS line, @oldId1 := `id`
		FROM tB
		ORDER BY `nameB`
	) tB
	LEFT JOIN (
		SELECT `id`, `nameC`, @line2 := IF(`id` = @oldId2, @line2+1, 1) AS line, @oldId2 := `id`
		FROM tC
		ORDER BY `nameC`
	) tC ON tB.`id` = tC.`id` AND tB.`line` = tC.`line`
	UNION
	SELECT tC.`id`, tB.`nameB`, tC.`nameC`
	FROM (
		SELECT `id`, `nameB`, @line3 := IF(`id` = @oldId3, @line3+1, 1) AS line, @oldId3 := `id`
		FROM tB
		ORDER BY `nameB`
	) tB
	RIGHT JOIN (
		SELECT `id`, `nameC`, @line4 := IF(`id` = @oldId4, @line4+1, 1) AS line, @oldId4 := `id`
		FROM tC
		ORDER BY `nameC`
	) tC ON tB.`id` = tC.`id` AND tB.`line` = tC.`line`
) poeben ON tA.`id` = poeben.`id`
выдает требуемый результат, тока не спрашивайте как оно работает
 
  • 🔴 13:27 Повітряна тривога в Харків.обл.
  • #29
Есть задчи из реальной жизни, а есть задачи для ума, головоломки, олимпиадные задачи. Очевидно, что данная задача относится ко второму типу.
Решение делал в версии SQL для VFP, т.к. другого под рукой не было, да и не силен я пока в MySQL. Надеюсь его возможно адаптировать.
SELECT IIF(isnull(tb.id), tc.id, tb.id) as id, nameb, namec from tb FULL OUTER JOIN tc ON (ASC(tc.namec)=ASC(tb.nameb)+26-3*tc.id AND tc.id = tb.id) INTO CURSOR t1
SELECT ta.id, namea, nameb, namec from ta LEFT JOIN t1 ON ta.id=t1.id
Таблицы b и с объединялись full outer join не по очевидному ключу id, а по коду ansi первого символа 'aaa'-'xxx' и т.д., проблема была в том, что для id=1 расстояние было 120-97 = 23 121-98 = 23, для id=2 119-99 = 20, что решилось условием ASC(tb.nameb)+26-3*tc.id. Также при таком объединении терялся ключ id и его пришлось восстанавливать из tb.id и tc.id через isnull.
 
Останнє редагування:
  • 🔴 13:27 Повітряна тривога в Харків.обл.
  • #30
а нафиг INTO CURSOR?
VFP с утра поддерживало подзапросы...

"ASC(tc.namec)=ASC(tb.nameb)+26-3*tc.id"
так вот что автор хотел этим сказать!
код перовго символа nameС должен быть равен коду первого символа nameВ плюс 26, минус 3 умножить на id.
как же это я сразу не догоадлсо...
 
  • 🔴 13:27 Повітряна тривога в Харків.обл.
  • #31
У меня получилось вот так для MS Sql:
Код:
declare @tA table (id int, nameA nvarchar(100))
declare @tB table (id int, nameB nvarchar(100), pos int IDENTITY(1,1), shift int)
declare @tC table (id int, nameC nvarchar(100), pos int IDENTITY(1,1), shift int)

insert into @tA(id, nameA)
select 1, 'Foot' union all
select 2, 'Head' union all
select 3, 'Leg'


insert into @tB(id, nameB)
select 1, 'aaa' union all
select 1, 'bbb' union all
select 2, 'ccc' union all
select 2, 'ddd'

insert into @tC(id, nameC)
select 1, 'xxx' union all
select 1, 'yyy' union all
select 1, 'zzz' union all
select 2, 'www'

update b
	set shift = pos - q.minPos
from @tB b
	join (
		select
			MIN(pos) as minPos,
			id
		from @tB
		group by id
	) q on q.id = b.id

update c
	set shift = pos - q.minPos
from @tC c
	join (
		select
			MIN(pos) as minPos,
			id
		from @tC
		group by id
	) q on q.id = c.id

select
	a.id,
	a.nameA,
	b.nameB,
	c.nameC
from @tC c
	full join @tB b on c.id = b.id and c.shift = b.shift
	right join @tA a on a.id = ISNULL(b.id, c.id)

На реальной базе данных, добавленые поля pos int IDENTITY(1,1), shift int выносятся во временные таблицы, и выборка уже идет из этих таблиц.
 
Останнє редагування:
Назад
Зверху Знизу