2016-03-15 7 views
0

Я не знаю, правильное ли название, но здесь идет моя проблема. Итак, я хочу создать View в phpmyadmin, используя данные из нескольких таблиц (рисунок ниже), View, который представляет обслуживание для ламп с полями из нескольких таблиц (подстанция, post_type, area, lamp_type, отказ и обслуживание)MySQL create Tables/Views

таблицы со связями: enter image description here

Я как-нибудь справимся и создали что-то вроде этого (рисунок ниже), что мне удалось создать с помощью этого блока кода:

 CREATE OR REPLACE VIEW 
v_lamp_I 
AS 
SELECT 
lamps.id, 
substation.code AS sub_code, 
substation.name AS sub_name, 
lamps.lamp_code, 
post_type.descript AS post_ty, 
lamp_type.descript AS lamp_ty, 
area.descript AS area_name, 
rasvjeta.adress, 
DATE_FORMAT(date_maintenance, "%d.%m.%Y.") AS date_main, 
lamps.geo_long, 
lamps.geo_lat 
FROM lamps 
INNER JOIN substiation ON substiation.id = lamps.substiation_id 
INNER JOIN post_type ON post_type.id = lamps.post_type_id 
INNER JOIN lamp_type ON lamp_type.id = lamps.lamp_type_id 
INNER JOIN area ON area.id = rasvjeta.area_id 
INNER JOIN maintenance ON maintenance.lamps_id = lamps.id 

enter image description here

Мне удалось создать представление, но проблема в том, что я вижу только строки/лампы (sifra_lampe), которые поддерживались только 4. В таблице лампы У меня 24 записи и всего 4 записи для но я хочу видеть все 24 записи, и если не было обслуживания для этой конкретной лампы, поле может быть пустым с форматом даты (00-00-00 или может быть NULL) и для записей/ламп, которые были сохранены. I хотите быть видимым полем даты.

Вот настольные лампы с записями. enter image description here

И вот вид с датой обслуживания. Как вы можете видеть, есть только 6 записей enter image description here

Я хочу видеть остальную часть записей, для ламп, которые не поддерживаются, могут быть нулевыми или датированными форматами (00-00-00) и для ламп которые поддерживаются форматом даты, могут оставаться неизменными, короче говоря, я хочу видеть все записи не только тех, которые поддерживались. Благодарю вас и жалею о длинном вопросе. Я не знал, как построить осмысленный и короткий вопрос, поэтому написал все.

+0

Я не могу сделать много смысла ваших имен таблиц, так что я оставлю соединение таблицы к вам, но вы должны смотреть на Присоединяется, чтобы получить представление, которое вы хотите. Внутреннее соединение показывает только полные совпадения (где обе таблицы имеют значения), вы должны использовать Left join (который показывает все перезаписи из первичной таблицы и выбирается из вторичного). При левом соединении ваша первая таблица должна быть той, у которой есть 24 записи, которые вы хотите отобразить, а вторичная таблица - та, которая имеет «нулевые» значения. Ответ здесь поможет вам: http://stackoverflow.com/questions/406294/left-join-and-left-outer-join-in-sql-server – Zero

+0

Хорошо, я попробую что-то подобное, thx:) – Svinjica

ответ

1
create or replace view 
v_lamp_I as 
SELECT lamps.id, 
substation.code AS sub_code, 
substation.name AS sub_name, 
lamps.lamp_code, 
post_type.descript AS post_ty, 
lamp_type.descript AS lamp_ty, 
area.descript AS area_name, 
rasvjeta.adress, 
lamps.geo_long, 
lamps.geo_lat 
FROM lamps 
INNER JOIN substiation ON substiation.id = lamps.substiation_id 
INNER JOIN post_type ON post_type.id = lamps.post_type_id 
INNER JOIN lamp_type ON lamp_type.id = lamps.lamp_type_id 
INNER JOIN area ON area.id = rasvjeta.area_id; 


CREATE OR REPLACE VIEW 
v_lamp_new 
AS 
select v_lamp_I.*,DATE_FORMAT(date_maintenance, "%d.%m.%Y.") AS date_main 
from v_lamp_I 
LEFT JOIN maintenance ON v_lamp_I.id = maintenance.lamps_id; 
+0

@Svinjica - Я ошибся, мы не можем использовать подзапрос в поле зрения. Попробуйте это. – user3436157

+0

Это работает, thx! Возможно ли, что вместо значения NULL записывается какая-то строка, например «Не было обслуживания?» – Svinjica

+1

да, мы можем использовать IFNULL (DATE_FORMAT (date_maintenance, % d.% m.% Y. "),« Не было обслуживания ») AS date_main вместо DATE_FORMAT (date_maintenance,«% d.% m.% Y. ») AS date_main – user3436157

1
CREATE OR REPLACE VIEW 
v_lamp_I 
AS 
select tbl_lamp.*,DATE_FORMAT(date_maintenance, "%d.%m.%Y.") AS date_main 
from (SELECT lamps.id, 
substation.code AS sub_code, 
substation.name AS sub_name, 
lamps.lamp_code, 
post_type.descript AS post_ty, 
lamp_type.descript AS lamp_ty, 
area.descript AS area_name, 
rasvjeta.adress, 
lamps.geo_long, 
lamps.geo_lat 
FROM lamps 
INNER JOIN substiation ON substiation.id = lamps.substiation_id 
INNER JOIN post_type ON post_type.id = lamps.post_type_id 
INNER JOIN lamp_type ON lamp_type.id = lamps.lamp_type_id 
INNER JOIN area ON area.id = rasvjeta.area_id) as tbl_lamp 
LEFT JOIN maintenance ON tbl_lamp.id = maintenance.lamps_id 
+0

@Svinjica попробуйте этот – user3436157

+0

Я сделал, и я получил это # ​​1349 - View's SELECT содержит подзапрос в предложении FROM. При анализе были обнаружены 3 ошибки. «Ожидалось выражение. (около «(« в позиции 119 ») Неожиданный токен (около« («в позиции 119») Этот тип предложения был ранее разобран. (около «SELECT» в позиции 121) ' – Svinjica