SQL Frage, MySQL SELECT mit Zuordnungen

Domi83

Rear Admiral
Registriert
Feb. 2010
Beiträge
5.408
Hallo Leute, ich habe da mal eine kleine Frage an euch. Wir haben hier bei uns eine MySQL Datenbank mit Daten die Zuordnungen haben, ähnlich wie hier im Forum...
- ID 1, Anwendungen
-- ID 5, Programmieren (Zuordnung, ID 1)
--- ID 12, Lego Duplo (Zuordnung, ID 5)
--- ID 14, Lego Technik (Zuordnung, ID 5)
---- ID 22, Lego sonstwas (Zuordnung, ID 14)

Möchte ich jetzt ganz klassisch alle Daten von ID 1 haben, mache ich ja folgendes...
Code:
SELECT * FROM tabelle WHERE id = 1 ORDER BY xxx ASC

Wobei man hier den "ORDER BY" vernachlässigen kann. Aber wie bekomme ich es denn jetzt hin, dass er mir bitte alles von id 1 und allem dazugehörigen ausgibt, wenn ich selbst gar nicht weiß welche IDs dazu gehören? Rein Theoretisch muss ich ja erst einmal alle IDs sammeln die zu der 1 gehören und dann den SELECT ausführen.

Aber da harkt es schon und vielleicht hat jemand von euch eine Idee wie man das realisieren kann.

Gruß, Domi
 
Auch wenn ich nicht bei Hausaufgaben helfen sollte:
SELECT für Zuordnung auf ID1, Ergebnis in ne Liste kippen. Ersten Eintrag der Liste suchen lassen, Ergebnis wieder in die Liste kippen und ersten Eintrag aus der Liste Streichen, nächster Eintrag der Liste suchen lassen, Ergebnis wieder in die Liste kippen und Eintrag streichen, etc.
 
Zuletzt bearbeitet:
Bitte hört mir auf mit solchen Vermutungen verdammt noch mal... :mad: Das ist keine Hausaufgabe, ich muss hier in der Firma eine SQL Abfrage aufbauen. Ich frage das nicht umsonst und wenn ich wüsste nach was ich bei Google suchen soll, würde ich Google fragen.
 
Hallo

Kann es nur ungefähr erklären:

$result = ... SELECT * FROM tabelle WHERE id = 1 ORDER BY xxx ASC ... (den Rest selber noch eintragen)
$id=mysql_fetch_array($result);

dann

$eintrag1 = $id[eintrag1];

$eintrag2 = $id[eintrag2];

echo $eintrag1;
echo $eintrag2;

etc.etc.etc. immer so weiter!

Kann Dir leider nur kurz erklären, aber versuche es mal ob Du es so hinkriegst. Eintrag1 und Eintrag2 sind nur Platzhalter, da musst du deine unter Kategorie-Name von deiner MySql Tabelle einzeln eintragen!

Ich hoffe Du hast es verstanden, ansonsten melde Dich nochmals :-) !

Lg
 
Datenbank mit Daten => mehrere Tabellen oder eine Tabelle?

Wie sieht die Tabelle/Tabellen aus? Das obige könnte alles mögliche sein.
 
Die Tabellen werden doch über einen Fremdschlüssel verknüpft sein. Die Tabellen joinen und dann korrekt filtern sollte die Lösung sein. Ohne konkrete Tabelleninfos wird Dir aber niemand eine spezifische Antwort geben können.
 
Hallo DualityMind, anhand deines Beispiels bleibt mir dann wohl keine andere Wahl, PHP mit zu benutzen, richtig? Ist jetzt nicht schlimm, dann muss ich die Zahlen in einem PHP Array sammeln und hinterher im Query ausgeben, fertig ist. Ich hatte halt gedacht das es da etwas direkt auf MySQL Basis gibt :)

Wenn man jetzt sagt, dass man Daten mit Zuordnungen haben will und dieses bei Google sucht, gibt es zwar Ergebnisse, aber diese beziehen sich auf JOIN etc. also zweite und dritte Normalform. Meine Daten sind ja in einer einzigen Tabelle und wurden von uns (Kollegen und mir) einfach mit einer Spalte (parent_id) verknüpft. Ob das so korrekt ist, weiß ich nicht... aber wir empfanden diese Idee als relativ einfach.

Da ich aber nun eine Ausgabe für Chef bauen soll und bemerkt habe, dass ich zu lange nichts mehr mit MySQL und PHP gemacht habe, musste ich mich erst einmal rein suchen und dann stand ich vor dem Problem, ob man innerhalb von MySQL diese Zahlen in ein Array packen kann um dann den SELECT Query zu füttern, ohne auf PHP zurück greifen zu müssen. Das man natürlich gleich ankommt mit dem Satz "ich möchte nicht bei Hausaufgaben helfen" stößt da echt bitter auf und dann sollte man lieber gar nichts sagen. Das erspart einem manchen Ärger ;)

Nachtrag: Moin ihr beiden, OK da war eine fehlende Information. Ich habe die Daten wirklich nur in einer Tabelle. Bei zwei oder drei hätte ich (wie geschrieben) die JOIN Funktion verwenden können, ist ja in diesem Fall nicht so. Wollten uns die zusätzliche Tabelle ersparen in die nur ID und ID2 (Beispiel) rein gekommen wäre.

Es geht darum, dass es ein Buchungstool für ein neues Projekt geben wird, welches wir gerade aufbauen. Da sollen andere Agenturen auch die Möglichkeit haben eine ID zu bekommen um Eingaben machen zu können. Wenn dann aber so etwas wie "Kunde wirbt Kunde" kommt, möchten wir zuordnen können wer wen geworben hat und über welche geworbenen kamen die folgenden geworbenen?! Ich kann das gerade schlecht formulieren, darum hatte ich das Beispiel mit dem Forum genommen, auch wenn es schlecht beschrieben war.
 
Zuletzt bearbeitet:
Moin moin, recursive ist ein echt gutes Stichwort... ich werde mal suchen ob ich da für MySQL etwas finde und auch Feedback geben, wenn es geklappt hat oder ob es Probleme gibt.

Nachtrag: Ich werde vermutlich nicht um eine PHP Abfrage herum kommen, mir ist gerade aufgefallen das ich ja (wie hier im Forum) die Kategorien und die Beiträge in unterschiedlichen Tabellen getrennt habe. Nur bei uns sind es die Kunden, dessen geworbenen Kunden und dann die eingebuchten Daten. Daher muss ich mittels PHP und einem Array erst einmal alle IDs sammeln die ich brauche und dann im zweiten Schritt die gesamten Daten sammeln und ausgeben lassen. Aber dennoch ist die recursive Geschichte ein sehr guter Ansatz :)
 
Zuletzt bearbeitet:
Zur Not kannst du das auch selbst entwickeln, sollte nicht so schwer sein. Hier etwas Pseudocode:

Funktion Main

Erstelle TemporäreTabelle
Transaktion Start
SpeichereKindelemente(1,1)
Transaktion Ende

End Funktion


Funktion SpeichereKindelemente(int kindId,int level)
insert into TemporäreTabelle SELECT Tabelle.*,level FROM Tabelle WHERE id = kindId

foreach record in SELECT * FROM tabelle WHERE zuordnung = id
SpeichereKindelemente(record.id, Level+1)


next record

End Funktion
 
Uff, OK... klingt in erster Linie recht kompliziert, aber mit dem recursive konnte ich ein passendes Beispiel finden und damit schon mal etwas anfangen :) Beispiel sieht jetzt wie folgt aus,
Code:
SELECT GROUP_CONCAT(lv SEPARATOR ',') AS ids FROM (
  SELECT @pv:=(SELECT GROUP_CONCAT(id SEPARATOR ',')
    FROM kunden WHERE parent_id IN (@pv)) AS lv
    FROM kunden JOIN (SELECT @pv:=1001)tmp
    WHERE id IN (@pv)
) temp;

Wenn ich nun wissen will, welche Kunden oder "unter-Kunden" zu dem mit der ID 1001 gehören, bekomme ich zumindest schon mal meine Aufzählung, damit kann ich schon mal weiter arbeiten. Entweder verschachtele ich diese Abfrage nun in einem übergeordneten SELECT Query um die Buchungen von den ganzen IDs zu bekommen, oder ich sammle es via PHP und baue mir damit einen SQL Query :)

Wie gesagt, recursive war das Wort was ich suchte und damit ist mir schon mal sehr viel weiter geholfen worden.
 
Weil die Zuordnung ParendID -> ID in der gleichen Tabelle sind. Ich habe keine separate Tabelle für Zuordnungen erstellt. Unsere "Kunden" sind Firmen, Makler, Agenturen etc. und Tabellen erstellen für Makler, unter Makler, unter unter Makler etc. wollten wir nicht. Wir wollten eine einzige Tabelle wo diese Personen, Firmen, Makler oder Agenturen drin sind und fertig ist.

Man legt dann eine neue Firma an und sagt "parent_id = 1" und fertig ist. Will man alle Firmen sowie Daten sehen, macht man schnell ein SELECT * FROM kunden und fertig ist. Wenn ich das wieder in mehrere Tabellen unterteile, müsste ich mit JOIN alles zusammen führen. Wenn ich die Zuweisungen über die (ich glaube) dritte Normalform aufbaue, also eine separate Tabelle anlege mit den Spalten ID und ParentID für die Zuweisung, finde ich das übertrieben da wir nur 1-n Beziehungen haben. Eine Firma kann ja mehrere Unterfirmen haben, aber eine Unterfirma kann nur einen über sich haben :D

Oder hattest du da an einen anderen JOIN Aufbau gedacht?

Nachtrag: Ich habe mal via HeidiSQL den CREATE code ausgelesen, vielleicht kann man sich den Aufbau der Tabelle dann besser vorstellen :)

Code:
CREATE TABLE `kunden` (
	`id` INT(5) NOT NULL AUTO_INCREMENT COMMENT 'Kunden ID',
	`parent_id` INT(5) NULL DEFAULT NULL COMMENT 'Zuordnung, Kunden ID',
	`firma` VARCHAR(50) NULL DEFAULT NULL COMMENT 'Firmenname',
	`anrede` ENUM('Herr','Frau') NULL DEFAULT NULL,
	`vorname` VARCHAR(50) NULL DEFAULT NULL,
	`nachname` VARCHAR(50) NULL DEFAULT NULL,
	`anschrift` VARCHAR(50) NULL DEFAULT NULL,
	`plz` VARCHAR(50) NULL DEFAULT NULL,
	`ort` VARCHAR(50) NULL DEFAULT NULL,
	`land` VARCHAR(50) NULL DEFAULT NULL,
	`tel` VARCHAR(50) NULL DEFAULT NULL,
	`fax` VARCHAR(50) NULL DEFAULT NULL,
	`email` VARCHAR(50) NULL DEFAULT NULL,
	`website` VARCHAR(50) NULL DEFAULT NULL,
	`iban` VARCHAR(50) NULL DEFAULT NULL,
	`bic` VARCHAR(50) NULL DEFAULT NULL,
	`benutzer` VARCHAR(50) NULL DEFAULT NULL,
	`kennwort` VARCHAR(50) NULL DEFAULT NULL,
	`status` TINYINT(1) NOT NULL DEFAULT '1' COMMENT 'Kunde Aktiv / Inaktiv',
	`permission` TINYINT(1) NOT NULL DEFAULT '0' COMMENT 'Berechtigung',
	`columns` VARCHAR(50) NULL DEFAULT '0,1,2,3,4,5,6' COMMENT 'Angezeigte Spalten',
	PRIMARY KEY (`id`)
)
COMMENT='Tabelle für Kunden / Firmen
COLLATE='utf8_general_ci'
ENGINE=InnoDB
ROW_FORMAT=COMPACT
AUTO_INCREMENT=1005;

Wobei ich da gerade gesehen habe, dort gibt es sogar schon Spalten, die meine Kollegen eingebaut haben :D
 
Zuletzt bearbeitet:
Zurück
Oben