Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2013, 19:38   #1
Владимир89
Новичок
Джуниор
 
Регистрация: 29.03.2013
Сообщений: 5
По умолчанию SQL-запрос

Здравствуйте, уважаемые форумчане.
Вот возникла проблема.
Есть запрос:
Код:
SELECT * FROM `system`
 LEFT JOIN `system_man` ON system.system_uuid = system_man.system_man_uuid, `processor`, `hard_drive`, `monitor`, `optical_drive` 
WHERE 
optical_drive_uuid = system_uuid 
AND hard_drive_uuid = system_uuid 
AND monitor_uuid = system_uuid 
AND processor_uuid = system_uuid 
AND hard_drive_uuid = processor_uuid 
AND optical_drive_timestamp = system_timestamp 
AND processor_timestamp = system_timestamp
 AND monitor_timestamp = system_timestamp 
AND hard_drive_timestamp = system_timestamp 
AND processor_device_id = 'CPU0' 
AND hard_drive_index = 0
Собственно изначально запрос был:
Код:
SELECT * FROM system
По идее надо, чтобы запрос выдавал те-же результаты, но добавлял в таблицу значения из других (перечисленных) таблиц.

Первый запрос вроде работает (выдаёт правильные связи), но далеко не все записи (например второй запрос выдаёт 166 записей, а первый только 152).

Как можно получить результат по первому запросу, но иметь при этом значения полей из других таблиц (в т.ч. и "пустых")?

Заранее благодарю за ответы.

Последний раз редактировалось Stilet; 29.03.2013 в 21:14.
Владимир89 вне форума Ответить с цитированием
Старый 29.03.2013, 21:18   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
SELECT * FROM `system`
 LEFT JOIN `system_man` ON system.system_uuid = system_man.system_man_uuid,   
 LEFT JOIN `processor` ON processor_uuid = system_uuid AND processor_timestamp = system_timestamp,
 LEFT JOIN , `hard_drive` ON hard_drive_uuid = processor_uuid and hard_drive_uuid = system_uuid AND hard_drive_timestamp = system_timestamp ,
 LEFT JOIN , `monitor` ON monitor_uuid = system_uuid  AND monitor_timestamp = system_timestamp ,
 LEFT JOIN , `optical_drive`  ON  optical_drive_timestamp = system_timestamp and optical_drive_uuid = system_uuid
WHERE 
  processor_device_id = 'CPU0' 
AND hard_drive_index = 0
Только я что-то не пойму реляцию...
Т.е. как-то ИМХО криво сама БД построена...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.03.2013, 12:04   #3
Владимир89
Новичок
Джуниор
 
Регистрация: 29.03.2013
Сообщений: 5
По умолчанию

Здесь суть такова:
Есть база компьютеров и серверов.
Основная информация пишется в system.
Про мониторы, ЦП, ОЗУ, приводы и пр. пишется в одноимённые таблицы.
Т.о. на одной машине не может быть 2 сев./южных мостов, но межет быть 2 ЦП (двухъядерный) и более одной планки оперативы, более 1-о видюшки и т.п.
Ну так вот. Запрос
Код:
SELECT * FROM system
выводит все системы, а т.к. при изменении конфигурации серийник материнки не меняется - то перезаписывается соотв. строка, но вот при изменении оборудования - оно просто добавляется и ставится новый timestamp на всё текущее оборудование, таким образом можно просмотреть историю изменений (бухгалтерии ну оч. надо).

А вот при выполнении запроса выше, если убрать свызку с system_uuid (id системы) - он начнёт тыкать всё снятое и нигде ныне не задействованное оборудование, а если убрать system_timestamp (дата обновления инфы о системы) - он выведет абсолютно всё (повторы машин, даже если конфигурация не менялась, т.к. timestamp обновляется всякий раз при опросе машины), т.е. получается уже не 166, а от 48532 до 73817, что особенно доставляет...

Суть в том, чтобы получить
Код:
SELECT * FROM system
но в результат добавить дополнительные столбцы, где значения xxx_uuid и xxx_timestamp соответствуют system_uuid и system_timestaamp.

Цитата:
Сообщение от Stilet Посмотреть сообщение
Код:
SELECT * FROM `system`
 LEFT JOIN `system_man` ON system.system_uuid = system_man.system_man_uuid,   
 LEFT JOIN `processor` ON processor_uuid = system_uuid AND processor_timestamp = system_timestamp,
 LEFT JOIN , `hard_drive` ON hard_drive_uuid = processor_uuid and hard_drive_uuid = system_uuid AND hard_drive_timestamp = system_timestamp ,
 LEFT JOIN , `monitor` ON monitor_uuid = system_uuid  AND monitor_timestamp = system_timestamp ,
 LEFT JOIN , `optical_drive`  ON  optical_drive_timestamp = system_timestamp and optical_drive_uuid = system_uuid
WHERE 
  processor_device_id = 'CPU0' 
AND hard_drive_index = 0
Только я что-то не пойму реляцию...
Т.е. как-то ИМХО криво сама БД построена...
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LEFT JOIN , `processor` ON processor_uuid = system_uuid AND processor_timestamp ' at line 1

Ответ системы на всё это...

Но всё равно спасибо за ответ.

Последний раз редактировалось Stilet; 30.03.2013 в 12:25.
Владимир89 вне форума Ответить с цитированием
Старый 30.03.2013, 12:24   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
check the manual that corresponds to your MySQL server version for the right syntax to use near 'LEFT JOIN
Мускул не знаю... Возможно там вместо LEFT JOIN используется что-то типа OUTER
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.03.2013, 12:24   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
SELECT * FROM `system`
 LEFT JOIN `system_man` ON system.system_uuid = system_man.system_man_uuid,   
 LEFT JOIN `processor` ON processor_uuid = system_uuid AND processor_timestamp = system_timestamp,
 LEFT JOIN , `hard_drive` ON hard_drive_uuid = processor_uuid and hard_drive_uuid = system_uuid AND hard_drive_timestamp = system_timestamp ,
 LEFT JOIN , `monitor` ON monitor_uuid = system_uuid  AND monitor_timestamp = system_timestamp ,
 LEFT JOIN , `optical_drive`  ON  optical_drive_timestamp = system_timestamp and optical_drive_uuid = system_uuid
WHERE 
  processor_device_id = 'CPU0' 
AND hard_drive_index = 0
выделенное красным не нужно.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 30.03.2013, 15:05   #6
Владимир89
Новичок
Джуниор
 
Регистрация: 29.03.2013
Сообщений: 5
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Код:
SELECT * FROM `system`
 LEFT JOIN `system_man` ON system.system_uuid = system_man.system_man_uuid,   
 LEFT JOIN `processor` ON processor_uuid = system_uuid AND processor_timestamp = system_timestamp,
 LEFT JOIN , `hard_drive` ON hard_drive_uuid = processor_uuid and hard_drive_uuid = system_uuid AND hard_drive_timestamp = system_timestamp ,
 LEFT JOIN , `monitor` ON monitor_uuid = system_uuid  AND monitor_timestamp = system_timestamp ,
 LEFT JOIN , `optical_drive`  ON  optical_drive_timestamp = system_timestamp and optical_drive_uuid = system_uuid
WHERE 
  processor_device_id = 'CPU0' 
AND hard_drive_index = 0
выделенное красным не нужно.
Так вывело 161 (вместо 166 от SELECT * FROM system), уже получше, но явно не то...
За ответ благодарствую.

Цитата:
Мускул не знаю... Возможно там вместо LEFT JOIN используется что-то типа OUTER
Эммм... Про Outer первый раз слышу... Вечером покурю тему. Спасибо.

Последний раз редактировалось Владимир89; 30.03.2013 в 15:15.
Владимир89 вне форума Ответить с цитированием
Старый 30.03.2013, 15:16   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Красным выделены ещё и разделяющие запятые, без них получается полный бардак.
Какие еще разделяющие. С этими запятыми просто ошибка синтаксиса будет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 30.03.2013, 15:47   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
С этими запятыми просто ошибка синтаксиса будет
Это я просто невнимательно писал.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.03.2013, 15:59   #9
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
Так вывело 161 (вместо 166 от SELECT * FROM system), уже получше, но явно не то...
условие выбросить и будет то
eval вне форума Ответить с цитированием
Старый 30.03.2013, 17:48   #10
Владимир89
Новичок
Джуниор
 
Регистрация: 29.03.2013
Сообщений: 5
По умолчанию

Цитата:
условие выбросить и будет то
Логику понял, поддался, проверил и понял, что не то (266 записей из 166 при простом запросе). Если убрать условие только по ядру ЦП - 205, а если только по винчестеру - 188.

Просто существуют и многоядерные машинки, в этом случае processor_device_id = не 'CPU0', а 'CPUn' (где n - номер ядра в системе)...
Также в системе (особенно сервере) может быть более одного винчестера, тогда и hard_drive_index = не 0, а, соответственно, номер харда по порядку (из числа существующих).
Такие вот пирожки, а за совет спасибо.
Владимир89 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запрос SQL stas45rus БД в Delphi 3 29.11.2012 18:04
Запрос с CASE переделать в запрос с PIVOT (MS SQL Server 2005) Машуля SQL, базы данных 4 06.05.2010 21:09
Создание новых таблиц в MS SQL SERVERE через SQL запрос в Delphi S_Yevgeniy Помощь студентам 1 27.10.2009 06:26
SQL запрос на основе другого SQL запрса... Timoxa БД в Delphi 1 07.01.2007 18:15