Erster Versuch mit Join-MYSQL

Joe

Erfahrenes Mitglied
Hallo Tutorials,
Hab mich mal an den Joins versucht die mir bisher völlig unverständlich waren.
Ist mir sogar erstaunlicherweisse recht gut gelungen.

Vieleicht kann wer von euch was dazu sagen was man anders oder besser machen könnte.
Auserdem würde ich gerne wissen wie ich die Zeit messen kann. Ist hierr möglicherweisse ein Left inner oder sonstiger Join besser und wenn ja weshalb? Würde gerne mehr darüber erfahren und bin daher über jeden Tip dankbar.

SQL:
SELECT
	t1.*,
	t2.*
FROM
	Gebaeudeanforderungen AS t1,
	GebaeudestufenUser AS t2
WHERE
	t2.Username='$Username'
AND
		t1.Gebäude 
	IN 
		(CONCAT('Lager',CASE WHEN (1+t2.Lager>=10) THEN '10' ELSE 1+t2.Lager END)
		,CONCAT('Bibliothek',CASE WHEN (1+t2.Bibliothek>=10) THEN '10' ELSE 1+t2.Bibliothek END)
		,CONCAT('Krankenstation',CASE WHEN (1+t2.Krankenstation>=10) THEN '10' ELSE 1+t2.Krankenstation END)
		,CONCAT('Labor',CASE WHEN (1+t2.Labor>=10) THEN '10' ELSE 1+t2.Labor END)
		,CONCAT('Brunnen',CASE WHEN (1+t2.Brunnen>=10) THEN '10' ELSE 1+t2.Brunnen END)
		,CONCAT('Tank',CASE WHEN (1+t2.Tank>=10) THEN '10' ELSE 1+t2.Tank END)
		,CONCAT('Werkstatt',CASE WHEN (1+t2.Werkstatt>=10) THEN '10' ELSE 1+t2.Werkstatt END)
		,CONCAT('Funkanlage',CASE WHEN (1+t2.Funkanlage>=10) THEN '10' ELSE 1+t2.Funkanlage END)
		,CONCAT('Funkturm',CASE WHEN (1+t2.Funkturm>=10) THEN '10' ELSE 1+t2.Funkturm END)
		,CONCAT('Viehstall',CASE WHEN (1+t2.Viehstall>=10) THEN '10' ELSE 1+t2.Viehstall END)
		,CONCAT('Garten',CASE WHEN (1+t2.Garten>=10) THEN '10' ELSE 1+t2.Garten END)
		,CONCAT('Garage',CASE WHEN (1+t2.Garage>=10) THEN '10' ELSE 1+t2.Garage END)
		,CONCAT('Schlafquartiere',CASE WHEN (1+t2.Schlafquartiere>=10) THEN '10' ELSE 1+t2.Schlafquartiere END)
		,CONCAT('Abwehrtürme',CASE WHEN (1+t2.Abwehrtürme>=10) THEN '10' ELSE 1+t2.Abwehrtürme END)
		,CONCAT('Mauern',CASE WHEN (1+t2.Mauern>=10) THEN '10' ELSE 1+t2.Mauern END));

Tabelle GebaeudestufenUser beinhaltet nur die jeweilige Stufe(int) des jeweiligen gebauten Gebäudes je User.
Tabelle Gebaeudeanforderungen beinhaltet zu jeden Gebäude und jeder Stufe die zum Bau benötigten Ressourcen.

Ausgabe: Nächste Baustufe des Gebäudes und die dazu benötigten Ressourcen.

Zum Concat: zb beim Lager kommt dabei der Spaltenname Lager2 raus.
Die Zahl darf nicht höher als 10 sein weil es nur 10 Stufen gibt (Stufe11 hätte keine Ressourcen).


Also bin für Tipss dankbar! Gruss Joe.
 
Zuletzt bearbeitet von einem Moderator:
Item: Dein CASE kannst du acuh einfach mit LEAST lösen
SQL:
CASE WHEN (1+t2.Lager>=10) THEN '10' ELSE 1+t2.Lager END
-- ist dasselbe wie
LEAST(1+t2.Lager, 10)
 
Zuletzt bearbeitet von einem Moderator:
  • Gefällt mir
Reaktionen: Joe
Danke Yaslaw das sind genau die Tipps die ich mir wünsche :)
Ich antworte morgen nochmal mit ein oder 2 Fragen auf deinem Post. Ist ja auch schon etwas spät, aber die Antwort wars mir wert :)

Gruss Joe.
 
Hab das so umgestzt wie vorgeschlagen Yaslaw.
Im Moment fällt mir auch keine Frage weiter ein. Intressant wäre wirklich noch zu wissen wie man die Zeit messen könnte. ZB. Ich nehme nen Inner Join oder Left Join und schaue was schneller geht.

Ansonsten wenn noch jemanden was zum Thema einfällt gerne :) , derweil hake ich Thema mal als erledigt ab.

Danke Yaslaw.
 
INNER JOIN und LEFT JOIN gibt versch. Resultate aus. Ergo bringt da ein Zeitvergleich nix. Du solltest die JOIN-Art anhand des gewünschten Resultates auswählen.

Wenn du wirklich mal Messungen machen willst, Kannst du ja in PHP die Zeit messen. Oder du nimmst HeidiSQL (mit dem Tool erstelle und Teste ich immer meine Queries). Dort wird die Zeit auch ausgegeben. Du kannst da ebenfalls den Execute-Plan anschauen.
 
  • Gefällt mir
Reaktionen: Joe
Hmm würde echt gerne mal nen Tutorial zu HeidiSQL sehen, sowas wie Handlng der Syntax und Query-Aufbau mit Hilfe von HeidiSQL. Einfach mal sehen wie nen Profi oder Forfgeschrittener damit so arbeitet. Bisher ist mir der Sinn dieses Proggs irgendwie noch unklar. Immerhin hab ichs hinbekommen die Zeit zu messen :D
HeidiSQL.PNG

Naja die Zeit zu messen wäre allein schon deswegen intressant um zu shen ob 2 Queries schneller oder langsamer arbeiten als der Join den man bastelt.
Die veschiedenen JoinArten muss ich mir nochmal genauer anschauen.
 
Ïm Unteren Bereich hast du hast du sowas wie ein Log. Alles was ausgeführt wird, wird dort angezeigt.
Schau mal in deinem PrintScreen im Unteren Logbereich die Zeile 238 und 240 an. Dort siehst du wie lange das Query brauchte....

Ansonsten siehts bei mir genauso aus wie bei dir. So testet man....
 
Jap habs gesehen. Genau darum gings. Hatte den Gedanken das php da zu ungenau wird daher ist HeidiSQL perfekt. Richtig intressant wird das Zeit messen dann bei sehr grossen Datenbanken.

Naja die Zeit zu messen wäre allein schon deswegen intressant um zu shen ob 2 Queries schneller oder langsamer arbeiten als der Join den man bastelt.
Die veschiedenen JoinArten muss ich mir nochmal genauer anschauen.
War quasi die Antwort auf deinen Post drüber :D
 

Neue Beiträge

Zurück