2016-03-15 1 views
0

Je ne sais pas si le titre est correct mais voici mon problème. Donc, je veux créer View dans phpmyadmin en utilisant les données de plusieurs tables (image ci-dessous), View qui représente la maintenance pour les lampes avec des champs de plusieurs tables (sous-station, post_type, area, lamp_type, failure et maintenance)MySQL create Tables/Vues

tables avec des connexions: enter image description here

J'ai en quelque sorte réussi et créé quelque chose comme ça (image ci-dessous), que je réussi à créer en utilisant ce bloc de code:

 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

J'ai réussi à créer une vue, mais le problème est avec cette vue, je ne peux voir que les lignes/lampes (sifra_lampe) qui ont été maintenues, seulement 4. Dans lampes J'ai 24 entrées et seulement 4 entrées pour maintenance.Mais, je veux voir toutes les 24 entrées et s'il n'y avait pas de maintenance pour cette lampe particulière, le champ peut être vide avec le format de la date (00-00-00 ou il peut être NULL) et pour les entrées/lampes qui ont été maintenues vouloir être un champ de date visible.

Voici des lampes de table avec des entrées. enter image description here

Et voici la vue avec la date de maintenance. Comme vous pouvez le voir il ya seulement 6 entrées enter image description here

Je veux voir le reste des entrées, pour les lampes qui n'ont pas été maintenues, les entrées peuvent être au format NULL ou DATE comme ceci (00-00-00) et pour les lampes qui ont été maintenus au format de la date peut rester le même, en bref, je veux voir toutes les entrées non seulement celles qui ont été maintenues. Merci et désolé pour une longue question. Je ne savais pas comment construire une question significative et courte, donc tout écrit.

+0

Je ne peux pas beaucoup de sens de vos noms de table, donc je vais laisser la connexion de table pour vous, mais vous devriez examiner pour obtenir la Jointures vue que vous voulez. La jointure interne ne montre que les correspondances complètes (où les deux tables ont des valeurs), vous devez utiliser la jointure à gauche (qui affiche tous les rerecords de la table primaire et sélectionnés à partir du secondaire). Avec la jointure à gauche, votre première table devrait être celle qui a les 24 enregistrements que vous voulez afficher et la table secondaire celle qui a les valeurs "nulles". La réponse va vous aider: http://stackoverflow.com/questions/406294/left-join-and-left-outer-join-in-sql-server – Zero

+0

Ok, je vais essayer quelque chose comme ça, merci: – Svinjica

Répondre

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 - Je me suis trompé, Essayez ceci: – user3436157

+0

Cela fonctionne, thx! Est-il possible qu'au lieu de valeur NULL écrit une chaîne, comme "Il n'y avait pas de maintenance?" – Svinjica

+1

oui nous pouvons, utiliser IFNULL (DATE_FORMAT (date_maintenance, " % d.% m.% Y. "), 'Il n'y avait pas de maintenance') AS date_main au lieu de 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 essayer celui-ci – user3436157

+0

J'ai fait, et je reçois ce # 1349 - SELECT de View contient une sous-requête dans la clause FROM. 3 erreurs ont été trouvées lors de l'analyse. 'Une expression était attendue. (near "(" à la position 119) Jeton inattendu (près de "(" à la position 119) Ce type de clause a déjà été analysé (près de "SELECT" à la position 121) ' – Svinjica