SQL Abfrage aus zwei Tabellen

Eurocid

Mitglied
Guten Morgen liebe Gemeinde

Ich habe wiedermal ne Frage, aber diesmal zu einer SQL Abfrage, ich bin leider zu schwach dafür, bekomme das einfach nicht hin.

Folgendes hätte ich gerne als SQL Code:

Aus der 1. Tabelle gebe ich über eine While Schleife, eine Spalte aus:

1. Tabelle

Apfel
Birne
Banane
usw...

2. Tabelle

Apfelbaum | Größe | Apfel | usw...
Birnenbaum | Größe | Birne | usw...

Ich hätte jetzt gerne in der gleichen While-Schleife, wie von Tabelle eins, dass aus der 2. Tabelle die Zeilen die ebenfalls Apfel als String haben, ausgewählt werden. Aber das der Baum ausgegeben wird der dazu passt. Zusätzlich sollte ich auch irgendwie die Anzahl der vorkommenten gleichen Strings (Bäume) zusammen zählen.

Ich habe mich gestern schon durch eine SQL Abfrage Tutorial gekämpft, und auch einiges gelernt, leider habe ich das was ich wollte nicht zusammen gebracht. :(

Ich hoffe das ist verständlich ausgedrückt, kann dann für einen Profi nur ein müdes lächeln sein.
Wäre sehr hilfreich wenn mir jemand gleich eine kleine Code Zeile zusammen bauen kann, vielleicht wenn möglich mit ner kleinen Erklärung, da ich noch nie aus 2 Tabellen zugleich abfragen gemacht habe.

Grüße
Cid
 
Leider ist deine Beschreibung nicht so ganz verständlich, aber du suchst wohl JOIN und eventuell noch GROUP BY.
Zeig doch mal den Aufbau der beiden Tabellen, ein paar Datensätze jeder Tabelle und dann das entsprechende Ergebnis dazu. Dann versteht man es sicher besser.
 
Bin grade eigentlich auf dem Sprung. Jedoch ungetestet. Hier die Kurze erklärung.

Gehen wir einfach mal davon aus, das du zwei Tabellen hast, Kategorie und ähm ... Artikel.
Kartegorie
ID|Name
---
1|Blumen
2|Bäume
3|Wayne

Artikel
ID|Name|Beschreibung|Kategorie_id

Kleiner Tipp am Rande, der Normale Standart bei SQL sagt man sollte(also kein muss) alle Spaltenbezeichnungen klein schreiben, weil alle SQL Befehle groß geschrieben werden. Jedoch sind SQL Befehle nicht Case-Sensetive.


PHP:
	$sql=
		'SELECT `ID`, `Name` '.
		'FROM `Kartegorie`'.
		'ORDER BY `ID`';
	$ds = mysql_query($sql);						   
	while ($rows=mysql_fetch_array($ds)) {
		'Kategorie' . $row['Name'] . 'hat die ID: ' . $row['ID'] . '<br />' . "\r\n";
	}
	/*
	* Ausgabe:
	* Kategorie Blume hat die ID: 1
	* Kategorie Bäume hat die ID: 2
	* Kategorie Wayne hat die ID: 3
	*/

Soweit hast du es ja verstanden.

Hier eine aber frage mit einem JOIN, in dem Falle wähle ich mal INNER JOIN. Jedoch ist das ganze JOIN verfahren etwas tricky. Ich geb dir nur mal einen Denkanstoß hierfür. Empfehle dir aber auf jedenfall noch das ein oder andere Manual zulesen.

PHP:
	$sql=
		'SELECT `k`.`Name` AS Kategorie_name,  `a`.`Name` AS Artikel_name'.
		'FROM `Kartegorie` `k`'.
		'INNER JOIN `Artikel `a` ON `k`.`ID` = `a`.`Kategorie_id`'.
		'WHERE `k`.`Name` = "Wayne"'.
		'ORDER BY `a`.`ID`';
Bei dieser Abfrage, hole ich mir alle Artikel bzw. hier nur den Namen des Artikel sowie den der Kategorie. In der WHERE Klause sage ich außerdem er sollen nur Artikel aus der Kategorie wayne angezeigt werden. Dieser Verknüpfe ich mit der Kategorie-ID und der Artikel-Kategorie_id. Somit habe ich zumindest schoneinmal eine Beziehung zueinander geschaffen.
 
Guten Morgen

Danke für die Antwort, sehr gut geschrieben fürs "am Sprung sein" :)

Ich habe noch ein wenig herum versucht, und verstehe das immer besser.
Aber zuerst eine Frage zu dieser JOIN ON Funtion, ich habe das schon im Internet nachgesehen, aber so richtig verstehe ich das nicht.

Was ist der unterschied zwischen JOIN INNER, JOIN OUTER, JOIN LEFT und was es da noch so gibt?
Und wann und wo brauche ich dieses ON? Und was tut es?

Aber das nur so neben bei gefragt, ich habe das jetzt mal ohne diese Befehle lösen versucht, vielleicht erkennt man daran was ich vorher gemeind habe.

Hier meine SQL Abfragen:

PHP:
// TEST

    $pg1 = "SELECT  k.name AS kat_name,
                    k.prod_gueter AS kat_gueter,
                    g.name AS gueter_name
            FROM    gebaeude_daten AS k,
                    dso_ws AS g ";
    $pg2 = mysql_query($pg1) or die (mysql_error());
    while ($pg = mysql_fetch_array($pg2))
    {

          $g2 = "SELECT name AS gueter_name,
                        prod_zeit AS gueter_time
                 FROM dso_ws
                 WHERE name='$pg[kat_name]'";
          $g1 = mysql_query($g2) or die (mysql_error());
          while ($gueter = mysql_fetch_array($g1))
          {
              echo $gueter["gueter_name"] . ";";
              echo $gueter["gueter_time"] . ";";
              echo $pg["kat_name"] . "<br />";
          }

          // echo $pg["kat_name"] . ";";
          // echo $pg["kat_gueter"] . ";";
          // echo $pg["gueter_name"] . "<br />";

    }

//TEST

Ich bin hier glaube ich dem Erfolg schon nahe. ;-)

Ausgegeben wird hier folgendes:

Haus1;Zeit1;Haus1
Haus1;Zeit1;Haus1
Haus2;Zeit2;Haus2
Haus2;Zeit2;Haus2

Was ja richtig wäre, aber alles doppelt ausgegeben wird. Wenn ich jetzt die Tabelle dso_ws um einen Eintrag erweitere, ist die Ausgabe dreifach!

Wie kann ich das jetzt so ändern dass ich jede Zeit nur einmal bekomme, und sollte es zu Haus1 mehrere Zeiten geben das sie addiert werden.
Und wie kann ich die SQL Abfrage zu einer zusammen fügen?

Ich hoffe jetzt ist klarer von was ich schwaffel. :D

Grüße Cid
 
Zuletzt bearbeitet:
Morgen Stunde hat Gold im Mund ;).
Ich habe noch ein wenig herum versucht, und verstehe das immer besser.
Aber zuerst eine Frage zu dieser JOIN ON Funtion, ich habe das schon im Internet nachgesehen, aber so richtig verstehe ich das nicht.
Das LEFT JOIN ON ist ein Filter, er greift nur auf Zeilen zu, die die ON Bedingung erfüllen. Im Endeffek eine ART WHERE jedoch dient dies nur zum eingrenzen der zu Holenden Informationen. Wenn deine Abfrage unten eine WHERE bedingung hat, kannst du diese auf die geJOINte tabelle ebenfalls Filtern.
Was ist der unterschied zwischen JOIN INNER, JOIN OUTER, JOIN LEFT und was es da noch so gibt?
Und wann und wo brauche ich dieses ON? Und was tut es?
Das JOIN LEFT etc. in wenigen worten zu erklären ist sehr schwer, weswegen ich dich einfach mal auf das MySQL Manual verweisen möchte.
Aber das nur so neben bei gefragt, ich habe das jetzt mal ohne diese Befehle lösen versucht, vielleicht erkennt man daran was ich vorher gemeind habe.

Ich bin hier glaube ich dem Erfolg schon nahe. ;-)
Ja und nein. Dem Erfolg bist du schon nahe jedoch verstehe ich es noch weniger aber ich rate gerne ;).
Ich hoffe jetzt ist klarer von was ich schwaffel. :D
Tendenziel würde ich jetzt GROUP BY und SUM() für dieses Verfahren benützten.

Bei deiner Tabellen Struktur müsste ich jetzt raten. In gebaeude_daten sind die Stamm daten zu jeden Haus oder? In dso_ws sind die Einzelnen Positionen bzw. bau abschnitte notiert, richtig?

Dann würde ich "einfach" erstmal mir alle Stammdaten holen. Danach mit einem INNER JOIN mir die Bau Zeit Summiert ausgeben lassen.

SQL:
SELECT `gd`.`name` AS kat_name,
       `gd`.`prod_gueter` AS kat_gueter,
       `dso`.`name` AS gueter_name,
	   SUM(`dso`.`prod_zeit`) AS gueter_time
FROM `gebaeude_daten` AS `gd`
INNER JOIN `dso_ws` AS `dso` ON `gd`.`name` = `dso`.`name`
GROUP BY `dso`.`name`

Das Summieren der Zeiten Funktioniert nur mit Felder wie z. B. Double / INT. Deswegen hoffe ich das du deine Datenbank Dementsprechen Aufgebaut hast.
 
Zuletzt bearbeitet von einem Moderator:
Also zu den Tabellen, ja bei der Tabelle gebaeude_daten sind alles infos zu den gebäuden gespeichert, diese Tabelle ist fix, und wird nur vom Admin geändert.

In die andere Tabelle können die verschiedenen Member ihre Gebäude eintragen, mit anderen wichtigen Informationen. (Wieviele jeder hat, welche eigenschaften jedes einzelne Haus hat...)

Und im jetzigen Problem, möchte ich ein Gebäude aus der gebaeude_daten Tabelle nehmen, und aus der anderen Tabelle sollen alle Gebäude Zeilen angesprochen werden die das selbe gebäude sind.

Hier ein Bsp.

Tabelle gebaeude_daten: Haus1

Tabelle dso_ws: summe aller Haus1 Zeit1 Größe1

Gesamtausgabe: Haus1 gibt es 4x gesamt Zeit1+Zeit1+Zeit1+Zeit1

(Wobei die Zeiten und andere Infos nicht immer die gleichen)

Brauchst du die ganze Tabellen Struktur, oder reichen diese Infos, wenn du mehr benötigst, ist das kein Problem.

Mfg
Cid

PS: Werd jetzt aber mal deine Tipps versuchen ;)
 
Dann habe ich das ja soweit getroffen. Was eben Interessant wäre, sind die Spalten Typen. du musst eigentlich nur beim GROUP BY das `dso`. durch du `gd`. austauschen. Sofern die Zeiten ein INTEGER bzw DOUBLE oder so etwas in der Richtung als Typ haben.
 
Hallo nochmal

Habe es jetzt so ziehmlich hin bekommen, das es passt, könnte aber glaube ich noch den Code verbessern.

So siehts jetzt mal aus:
(Habs jetzt ohne JOIN ON gemacht)

PHP:
$pg1 = "SELECT  k.name AS kat_name,
                    k.prod_gueter AS kat_gueter,
                    g.name AS gueter_name,
                    (SUM(g.ges_zeit) / 51) AS gueter_zeit
            FROM    gebaeude_daten AS k,
                    dso_ws AS g
            WHERE   g.name='$gueter[1]'";
    $pg2 = mysql_query($pg1) or die (mysql_error());
    while ($pg = mysql_fetch_array($pg2))
    {
    $einkommen = number_format($pg["gueter_zeit"] / 100,2,",",".");
    echo $einkommen . " <span>Stk/Min</span>";
    }

Habe mir die Tabellen nochmal angepasst, sodass die rechnerei schon vor dem Eintrag gemacht wird. Damit ich dann mit SUM alles zusammen zählen kann.
Das einzige was mir nicht gefällt ist das er mir das Ergebnis *51 rechnet ?
Das halb (SUM(g.ges_zeit) / 51), kannst du mir sagen woran das liegt, und wie ich das verhindern kann.

Ansonsten klappt das jetzt, vielen dank für deine Hilfe:

Grüße Cid
 
Wäre irgendwie gschmeidig, wenn du irgendwie kurz nen Datenbank Dump machen könntest. Kann mir das *51 grade auch nicht wirklich erklären.
 
Danke für dein Interresse.

Ich habe das Projekt im Moment eingestellt, deshalb habe ich nichts mehr zurück geschrieben.
Ausserdem hab ich jetzt das Thema als Erledigt markiert, da ich dazu ja keine Infos mehr brauche.

Wegen der 51* , ich denke das liegt an der darüber liegenden While Schleife, leider konnte ich mich davon noch nicht überzeugen da ich das Problem im eigentlichen Sinn nicht gelöst habe.

Trotzdem danke für deine Hilfe. :)
Cid
 
Zurück