Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Здравствуйте.
Бьюсь над запросом, но ни как не получается.
Неактивен
oowriter 3.2 падает на этом файле
Попробуйте представить в виде нескольких текстовых файлов. Обнаружите, что
это дико удобно
Неактивен
Ну чтож. Если Вы считаете, что так удобнее, вот.
Сразу оговорюсь, это не задачка, показать свои умения, мне действительно нужен результат для работы.
Отредактированно dimkainc (27.02.2011 23:38:18)
Неактивен
Хм. А Вы не пробовали пользоваться mysqldump для создания текстовых файлов?
Не нужно было бы тратить столько усилий Вам, и (с моей точки зрения — главное)
не нужно было бы тратить столько усилий мне, чтобы загрузить эти данные в тесто-
вую базу
Теперь что касается самой проблемы — она дико нереалистично выглядит. Скорее
всего, у Вас очень неудачно хранятся данные. При нормальной организации такие
вопросы не возникают. Плоха проблема тем, что она недетерминистична (т.е. при
одних и тех же данных в таблицах Вы не можете внятно сформулировать, какие
данные Вы ожидаете получить в выборке). Поясню на примере.
Исходные данные: WorkId CompId DispId PrintId ScanId UserId 1 1 1 пусто 1 1 1 1 1 пусто 1 2 1 1 1 пусто 1 3 1 1 2 пусто 1 1 1 1 2 пусто 1 2 1 1 2 пусто 1 3 Желаемое: 1 1 1 пусто 1 1 1 пусто 2 пусто пусто 2 1 пусто пусто пусто пусто 3 Альтернативное желаемое: 1 1 2 пусто 1 1 1 пусто 1 пусто пусто 2 1 пусто пусто пусто пусто 3
Я добавил раздел «альтернативное желаемое», которое точно так же следует из
тех же самых данных и полностью удовлетворяет Вашим требованиям желаемого.
Более того, этих альтернативных желаемых много. Именно поэтому Вам не удается
сформулировать запрос — его нельзя сформулировать.
Соответственно, решение — подумать, какую действительно задачку Вы решаете.
И решать реальную задачку, а не эту. Например, я допускаю, что Вас устроит
решение с GROUP_CONCAT по всем полям, кроме первого, и группировкой по первому
полю.
Неактивен
Да, я придумал костыльное решение:
SELECT @CompId := 0, ...; -- инициализировать переменные
SELECT WorkId, IF(@CompId = CompId, NULL, @CompId := CompID) AS CompID, ... -- вывести данные
Оно будет работать в случае, если Вы будете всегда подсовывать независимые
таблицы (они же у Вас независимые!) в виде подзапросов с правильной сорти-
ровкой (т.е. FROM ... JOIN (SELECT CompId FROM Computers WHERE WorkId = WorkState.WorkId ORDER BY CompId) AS Computers)
Но это правда костыль над костылем и костылем погоняет. Подумайте лучше над
правильной формулировкой решаемой задачи.
Неактивен
dimkainc - Вы не правильно нарисовали связи. Все связи привязаны к рабочему месту(к одной точке объединения).
А должно быть в виде дерева.
Неактивен
Эх. Спасибо за разъяснения. К сожалению исходные данные и способ привязки уже не изменить.
Что касается исходных данных, то их столько, что тот запрос, который приведен в начале выдаёт 15 миллионов строк, в то время как общее число строк должно получиться порядка 300. Соответственно я не пытался из выгружать, а привёл для наглядности упрощённый вариант.
Костыль, о котором Вы говорите, наверно будет работать по времени так же, как и текущий запрос, то есть более 15 минут на получение результата.
Да, меня бы устроил любой альтернативный вариант, но, видимо без связки sql+внешний модуль обработки результата не обойтись.
Неактивен
Tsvetkov написал:
dimkainc - Вы не правильно нарисовали связи. Все связи привязаны к рабочему месту(к одной точке объединения).
А должно быть в виде дерева.
А что делать, если так оно и есть. Любое оборудование может быть установлено на конкретное рабочее место, и от замены оборудования, работоспособность за рабочим местом не изменится. То же самое и про пользователей - они работают в разные смены, но за одним рабочим местом. Нет ни чего закреплённого друг за другом, а только за этим самым рабочим местом. Соответсвенно резерв хранится на складе и, по мере поломок, со склада берут замену.
Неактивен
Хм... в принципе вариант:
Отредактированно dimkainc (28.02.2011 08:06:36)
Неактивен
Ну так и группируйте тогда?
Неактивен
dimkainc написал:
Tsvetkov написал:
dimkainc - Вы не правильно нарисовали связи. Все связи привязаны к рабочему месту(к одной точке объединения).
А должно быть в виде дерева.А что делать, если так оно и есть. Любое оборудование может быть установлено на конкретное рабочее место, и от замены оборудования, работоспособность за рабочим местом не изменится. То же самое и про пользователей - они работают в разные смены, но за одним рабочим местом. Нет ни чего закреплённого друг за другом, а только за этим самым рабочим местом. Соответсвенно резерв хранится на складе и, по мере поломок, со склада берут замену.
Вы подключаете монитор к компьютеру , а не к рабочему месту. И когда Вы производите
соединение через WorkState таблици Computers и Display, то происходит перемножение.
И вместо 2-х записей получаете 4 записи для 1 рабочего места.
Т.е. неправильно спроектировали базу и из-за этого происходят проблемы .
Неактивен
Tsvetkov написал:
Вы подключаете монитор к компьютеру , а не к рабочему месту. И когда Вы производите
соединение через WorkState таблици Computers и Display, то происходит перемножение.
И вместо 2-х записей получаете 4 записи для 1 рабочего места.
Т.е. неправильно спроектировали базу и из-за этого происходят проблемы .
На рабочих местах и стоит по одному компьютеру, и одному дисплею или двум дисплеям. Даже если есть один компьютер и 2 дисплея, я получаю две записи, а не 4, как Вы, уважаемый, утверждаете. Но комбинации начинаются тогда, когда не один тип устройства, а несколько разных могут быть использованы с одним компьютером.
- К коммпьютеру можно подключить 2 дисплея, или по вашему нельзя?
- К компьютеру можно подключить 2 и более принтеров, сканеров, или опять таки нельзя?
- За одним компьютером могут работать 2 и более человека в разное время, или опять скажете, что нельзя?
Теперь рассмотрите следующие комбинации:
- компьютер, первый дисплей, пользователь 1,
- компьютер, первый дисплей, пользователь 2,
- компьютер, второй дисплей, пользователь 1,
- компьютер, второй дисплей, пользователь 2
Хотите строго указать каждому из пользователей пользоваться только "своим" дисплеем?
Теперь Давайте взглянем глубже - мы меняем системный блок на рабочем месте - дисплей остаётся, принтер остаётся, сканер остаётся, даже пользователи остаются, только один компьютер меняется на другой.
Как правильно спроектировать структуру базы данных, чтобы не надо было из-за замены одного устройства лазать по всей базе данных, исправляя все деревья? Поправьте, если я не прав. К тому же большинство комбинаций получается именно на складе, где хранится большое количество резерва, ни как между собою не скоммутированного.
К сожалению GROUP_CONCAT в купе с DISTINCT не совсем правильные даёт результаты для не ключевых полей.
Я остановился на использовании UNION, как самом быстром получении данных и последующей обработкой результата вне SQL.
А в желаемом виде, к сожалению, от меня начальство потребовало результаты, чтобы не смотреть лишние строчки.
Спасибо, большое, за участе!
Отредактированно dimkainc (28.02.2011 17:14:36)
Неактивен
Они не лишние, они единственно разумные ведь? Если монитор привязан к рабочему
месту 1, а мышка привязана к тому же рабочему месту, то она привязана к рабочему
месту 1
Неактивен
Страниц: 1