• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Verbinden wenn mehr werte in spalte (1,3)

Cheffchen

Senior HTML'ler
Hallo,

ich plane gerade und habe eine grundsätzliche frage die ich mit suchen nicht lösen konnte.
Mein Plann 2 Tabellen, 1 haupt und 1 auslagerungstabelle

Haupt
id|name|optionen
1|xxx|1,3
2|yyy|2

auslagerungstabelle
id|de|en
1|rechts|right
2|oben|top
3|links|left
...

am ende soll die ausgabe sein

xxx|rechts links
yyy|oben

ich bekommen die einfach nicht verbunden bzw. bekommen nur den id2 verbunden weil da nur eine zahl drin steht bei option
Theoretisch geht das ja so:
PHP:
SELECT h.name, h.optionen, a.de, a.en
FROM haupt h
LEFT JOIN auslagerungstabelle a ON h.optionen = a.id

wie mach ich das bei id1 wo ja bei option 1,3 steht?
oder bin ich total falsch?

Cheffchen
 
Werbung:
Ansonsten schon überlegt eine Zuweisungstabelle zu machen, sprich 3. Norm. Falls ich richtig liege, Theorie ist schon etwas her

Aber habe mir nun gedacht

Haupt
id|name
1|xxx
2|yyy

auslagerungstabelle
id|de|en
1|rechts|right
2|oben|top
3|links|left

Zuweisungstabelle
HauptID|auslagerungID
1|1
1|3
2|2

Wegen sql musst du denn mal probieren, aber ich denke wenn du es so machst, wird es einfacher sein
 
Werbung:
Hallo,

ich plane gerade und habe eine grundsätzliche frage die ich mit suchen nicht lösen konnte.
Mein Plann 2 Tabellen, 1 haupt und 1 auslagerungstabelle

Haupt
id|name|optionen
1|xxx|1,3
2|yyy|2

auslagerungstabelle
id|de|en
1|rechts|right
2|oben|top
3|links|left
...

am ende soll die ausgabe sein

xxx|rechts links
yyy|oben

ich bekommen die einfach nicht verbunden bzw. bekommen nur den id2 verbunden weil da nur eine zahl drin steht bei option
Theoretisch geht das ja so:
PHP:
SELECT h.name, h.optionen, a.de, a.en
FROM haupt h
LEFT JOIN auslagerungstabelle a ON h.optionen = a.id

wie mach ich das bei id1 wo ja bei option 1,3 steht?
oder bin ich total falsch?

Cheffchen

Ich würde es so machen wie von @B3nnoX beschrieben.
Die Sprachen allerdings ohne fixierte Spalten. Hier ein Beispiel:

Code:
DROP TABLE IF EXISTS main;
DROP TABLE IF EXISTS main_option;
DROP TABLE IF EXISTS main_option_lang;

CREATE TABLE main(main_id integer PRIMARY KEY, name text);
INSERT INTO main VALUES(1,'xxx');
INSERT INTO main VALUES(2,'yyy');

CREATE TABLE main_option(main_option_id integer PRIMARY KEY, main_id integer);
INSERT INTO main_option VALUES(1,1);
INSERT INTO main_option VALUES(2,1);
INSERT INTO main_option VALUES(3,2);

CREATE TABLE main_option_lang(main_option_id integer, code text, value text);
INSERT INTO main_option_lang VALUES(1,'de','rechts');
INSERT INTO main_option_lang VALUES(1,'en','right');
INSERT INTO main_option_lang VALUES(2,'de','links');
INSERT INTO main_option_lang VALUES(2,'en','left');
INSERT INTO main_option_lang VALUES(3,'de','oben');
INSERT INTO main_option_lang VALUES(3,'en','top');

SELECT
  m.name, GROUP_CONCAT(mol.value SEPARATOR ' ')
FROM
  main AS m
LEFT JOIN
  main_option AS mo
  USING (main_id)
LEFT JOIN
  main_option_lang AS mol
  USING (main_option_id)
WHERE
  mol.code = 'de'
GROUP BY m.main_id;
 
Hallo,

danke für diese konkreten hilfen und sehe leider das ich da wohl zu blau äugig an die sache ran gegangen bin.

Zuweisungstabelle muss das sein?
macht das nicht auch das bearbeiten des Datensatzen komplizierter, wenn mal ein mehr oder weniger wird beim haupt datensatz?
@scbawik die abfrage hätte ich so nie im traum hinbekommen :O(

Oder ich habe das einfach falsch Beschrieben oder den falschen Ansatz, mir ist das ja fast egal wie die DB aussieht (ausser einfach aufgebaut :O) ).

Ich habe ein Datensatz mit 3 kleinen Textfeldern und ca. 10 Checkboxgruppen mit je 5 bis 10 checkboxen.


oder einfach nur mit ids arbeiten/Speichern und die ganzen checkbox namen in eine Tabelle packen und dann ein DB Abfrage immer vor der richtigen machen, um ein Arrays zu bauen und das halt per PHP ausgegeben wird (oh man das versteht keiner mehr oder :O))

$option=array('1'=>'top','2'=>'left','3'=>'blacke','4'=>'right',... alle optionen aller checkboxgruppen)
Ausageb der $option[$row['Checkboxgruppen1']] und $option[$row['Checkboxgruppen2']] ...

So habe ich das bis jetzt für mich immer gemacht, aber immer heist ja nicht richtig :O)

Cheffchen
 
Also ich weiß nun nicht was daran komplizierter sein soll, müsste man wohl denn 2 querys ausführen wenn was hinzu kommt oder entfernt wird.
Aber zu @scbawik Beispiel ist mir die Zeile aufgefallen
CREATE TABLE main_option(main_option_id integer PRIMARY KEY, main_id integer);

die main_option_id darf natürlich kein PRIMARY KEY sein, weil sie somit nur einmal auftauchen darf

Aber wie gesagt das kompizierte sehe ich nicht :) Aber ich werde mal versuchen bei deinem Vorhaben durchzusteigen, zur Zeit stehe ich noch auf dem schlauch :D
 
Werbung:
Also ich weiß nun nicht was daran komplizierter sein soll, müsste man wohl denn 2 querys ausführen wenn was hinzu kommt oder entfernt wird.
Aber zu @scbawik Beispiel ist mir die Zeile aufgefallen
CREATE TABLE main_option(main_option_id integer PRIMARY KEY, main_id integer);

die main_option_id darf natürlich kein PRIMARY KEY sein, weil sie somit nur einmal auftauchen darf

Aber wie gesagt das kompizierte sehe ich nicht :) Aber ich werde mal versuchen bei deinem Vorhaben durchzusteigen, zur Zeit stehe ich noch auf dem schlauch :D

Als ich das geschrieben habe, bin ich davon ausgegangen dass jeder "main"-Entry individuelle "options" hat.
Wenn alle Entries allerdings auf die gleichen "options" zugreifen, hast du natürlich recht :)
 
Verdammt sry :D Hab nicht aufgepasst, du hast es umgedreht. Ich hab zu sehr an meinem Beispiel gedacht, da bei mir die erste Spalte die main_id ist. Deins ist natürlich doch richtig
 
Hallo,

ich habe vor ein Formular zu Speichern und denn dann natürlich auch wieder zu bearbeiten und wo anders ausgegeben werden können.
Das Formular besteht aus 3 Textfelder und ca. 10 checkbox gruppen farbe[], seite[] .... mit je 3-10 checkbox.
Ich dachte, ich kann einfach je checkbox gruppen eine Splate erstellen wo dann die ids der angeklickten gespeichert werden, in der art 1,5,6. Bei der ausgabe wollte ich das eigentlich Verbinden das dort die Namen ausgegeben werden die in je einer anderen Tabelle stehen je Gruppe.

Aber vielleicht geht das ja einfach nicht und ich seh ein problem was eigentlich keins ist weil die verbindung kein Sin macht.
Namen anstelle der id zu speichern möchte ich nicht, da mehr Sprachen angedacht sind. Also vielleicht doch ein große option tabelle mit id, namen in verschiedenen sprachen und Gruppen zuprdnung farbe/seite...

Cheffchen
 
Werbung:
Verdammt sry :D Hab nicht aufgepasst, du hast es umgedreht. Ich hab zu sehr an meinem Beispiel gedacht, da bei mir die erste Spalte die main_id ist. Deins ist natürlich doch richtig

Ach ja, stimmt :)

Hallo,

ich habe vor ein Formular zu Speichern und denn dann natürlich auch wieder zu bearbeiten und wo anders ausgegeben werden können.
Das Formular besteht aus 3 Textfelder und ca. 10 checkbox gruppen farbe[], seite[] .... mit je 3-10 checkbox.
Ich dachte, ich kann einfach je checkbox gruppen eine Splate erstellen wo dann die ids der angeklickten gespeichert werden, in der art 1,5,6. Bei der ausgabe wollte ich das eigentlich Verbinden das dort die Namen ausgegeben werden die in je einer anderen Tabelle stehen je Gruppe.

Aber vielleicht geht das ja einfach nicht und ich seh ein problem was eigentlich keins ist weil die verbindung kein Sin macht.
Namen anstelle der id zu speichern möchte ich nicht, da mehr Sprachen angedacht sind. Also vielleicht doch ein große option tabelle mit id, namen in verschiedenen sprachen und Gruppen zuprdnung farbe/seite...

Cheffchen

Dann würde ich es so aufbauen:

option:
option_id|name|value
1|farbe|red
2|farbe|blue
3|seite|xyz

option_lang:
option_id|code|value
1|de|Rot
1|en|Red
2|de|Blau
2|en|Blue
3|de|Xyz
3|en|Zyx

main:
main_id|name
1|main1
2|main2

main_options:
main_id|option_id
1|1
1|2
1|3
2|2
2|3

Du darfst nicht vergessen, dass die Datenbank-Daten für dich als Menschen nicht einfach lesbar sein müssen.
Wichtiger ist, dass das Schema logisch aufgebaut ist und sich somit einfach und performant lesen/schreiben lässt.
 
Und wenn man die Zuordnungstabelle in ein PHP Array läd und dann einfach die gespeicherten ID´s mit explode auftrennt und über das Array dann deren Namen abfragt.

PHP-Array:
Code:
array(
    de => array(
        Rot,
        Blau
    ),
    en => array(
        ..
    )
)

//Edit: Ok das von scbawik sieht besser aus.
 
Hallo @scbawik und @B3nnoX ,

das thema lässt mir keine ruche.
Ich habe das wie oben erstellt und sogar im großen und ganzen verstanden was da steht.

Ich habe aber kein blassen schimmer wie ich die optionen bearbeiten kann?
ich kann doch nicht vor jedem speichen alle optionen einer main_id aus main_option löschen und dann das neue speichern oder?

zb von main_id 1 soll main_option von 1,2 auf 1,3 geändert werden, ein update geht da ja nicht, also müsst ich zwei abfragen senden, delet alle mit main_id 1 und insert option 1 und 3 mit main_id 1 oder?

Cheffchen
 
Werbung:
Hallo @scbawik und @B3nnoX ,

das thema lässt mir keine ruche.
Ich habe das wie oben erstellt und sogar im großen und ganzen verstanden was da steht.

Ich habe aber kein blassen schimmer wie ich die optionen bearbeiten kann?
ich kann doch nicht vor jedem speichen alle optionen einer main_id aus main_option löschen und dann das neue speichern oder?

zb von main_id 1 soll main_option von 1,2 auf 1,3 geändert werden, ein update geht da ja nicht, also müsst ich zwei abfragen senden, delet alle mit main_id 1 und insert option 1 und 3 mit main_id 1 oder?

Cheffchen

Ist das Löschen denn ein Problem?
Aus meiner Sichtweise eigentlich nicht.
Alles andere wäre viel komplizierter (Abgleich/Synchronisieren).
 
Zurück
Oben