strubi
Anmeldungsdatum: 4. August 2010
Beiträge: 180
|
Hallo Zusammen
Ich habe eine Frage bezüglich einer SQL Abfrage bei MySQL. Die Abfrage sieht wie folgt aus: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | SELECT
`op`.`text` AS `Arbeitsgruppe`,
CONCAT('%',`op`.`text`,'%') AS `Suchabfrage`,
(SELECT `cfc`.`model_id` FROM `groupoffice`.`cf_ab_contacts` `cfc` WHERE `cfc`.`col_19` LIKE CONCAT('%',`op`.`text`,'%')) AS `Teamleiter ID`
eamleiter`
FROM
`groupoffice`.`cf_select_options` `op`
WHERE
`op`.`field_id` = 19
ORDER BY
`op`.`text` ASC
|
Das Problem ist, ich benötige das Feld "Arbeitsgruppe" in der Suchabfrage der "Teamleiter ID". Im Feld
Stehen unter Umstände mehrere Werte in der Form von "Wert 1|Wert 2|Wert 3" etc. Wenn ich den suchwert mit
| CONCAT('%',`op`.`text`,'%') AS `Suchabfrage`,
|
zusammen bastle dann erhalte ich die richtige Suchanfrage. Nur leider funktioniert die dann in der LIKE Abfrage nicht. Kann mir jemand helfen? Irgend wie stehe ich da auf dem Schlauch ... Vielen Dank Gruss strubi
|
gusenichnyy
Anmeldungsdatum: 10. Juli 2014
Beiträge: Zähle...
|
Hallo, das sieht so aus als geht es nicht weil du einen Wert von deinem Haupt select Befehl im Subselect verwenden willst.
|
Lysander
Anmeldungsdatum: 30. Juli 2008
Beiträge: 2669
Wohnort: Hamburg
|
strubi schrieb: Stehen unter Umstände mehrere Werte in der Form von "Wert 1|Wert 2|Wert 3" etc.
Wieso? Sieht nach furchtbar schlechten DB-Design aus. Kann man das fixen?
Kann mir jemand helfen? Irgend wie stehe ich da auf dem Schlauch ...
Gib uns doch mal die Tabellendefinitionen und Demo-Daten... damit lässt es sich besser analysieren und ggf. auch experimentieren!
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13219
|
gusenichnyy schrieb:
das sieht so aus als geht es nicht weil du einen Wert von deinem Haupt select Befehl im Subselect verwenden willst.
Nein, das sollte kein Problem sein. Mit SQLite geht das, dann geht es vermutlich auch mit My SQL: 1
2
3
4
5
6
7
8
9
10
11
12
13 | sqlite> create table t1 ( x int not null );
sqlite> select x from t1;
sqlite> insert into t1 values (1);
sqlite> insert into t1 values (2);
sqlite> insert into t1 values (3);
sqlite> select x from t1;
1
2
3
sqlite> select x, (select x+1) as y from t1;
1|2
2|3
3|4
|
Das Grundproblem hier steckt da: strubi schrieb:
Im Feld
Stehen unter Umstände mehrere Werte in der Form von "Wert 1|Wert 2|Wert 3" etc.
Das ist nicht normalisiert, womit Du Dir (und der SQL-Engine) automatisch das Leben schwer machst. Damit kannst Du nicht vernünftig joinen. Obwohl, moment: wieder in SQLite: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 | sqlite> alter table t1 add foo varchar(100);
sqlite> .schema
CREATE TABLE t1 ( x int not null , foo varchar(100));
sqlite> select * from t1;
1|
2|
3|
sqlite> update t1 set foo = 'hello' || x;
sqlite> select * from t1;
1|hello1
2|hello2
3|hello3
sqlite> select tt1.x, tt2.x from t1 as tt1 join t1 as tt2 on tt1.x = tt2.x;
1|1
2|2
3|3
sqlite> select tt1.x, tt2.x from t1 as tt1 join t1 as tt2 on tt1.foo like 'hello' || tt2.x;
1|1
2|2
3|3
sqlite> select tt1.x, tt2.x from t1 as tt1 join t1 as tt2 on tt1.foo like '%hello' || tt2.x;
1|1
2|2
3|3
sqlite> select tt1.x, tt2.x from t1 as tt1 join t1 as tt2 on tt1.foo like '%hello' || tt2.x || '%';
1|1
2|2
3|3
|
Vielleicht versuchst Du es dann auch mal mit einem Join anstatt der Inline-Query.
|
misterunknown
Ehemalige
Anmeldungsdatum: 28. Oktober 2009
Beiträge: 4403
Wohnort: Sachsen
|
strubi schrieb: Das Problem ist, ich benötige das Feld "Arbeitsgruppe" in der Suchabfrage der "Teamleiter ID". Im Feld stehen unter Umstände mehrere Werte in der Form von "Wert 1|Wert 2|Wert 3" etc.
Wenn ich den suchwert mit zusammen bastle dann erhalte ich die richtige Suchanfrage. Nur leider funktioniert die dann in der LIKE Abfrage nicht.
Zuerst: Ja, meine Vorposter haben recht, es ist wirklich nicht schön. Kein normalisiertes Datenbankdesign ist immer mit viel Aufwand verbunden. Zu deinem Problem: Nimm statts LIKE einfach REGEXP. Dann sollte es funktionieren.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13219
|
rklm schrieb:
Vielleicht versuchst Du es dann auch mal mit einem Join anstatt der Inline-Query.
Das sollte dann so aussehen: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | SELECT
`op`.`text` AS `Arbeitsgruppe`,
CONCAT('%',`op`.`text`,'%') AS `Suchabfrage`,
`cfc`.`model_id` AS `Teamleiter ID`
FROM
`groupoffice`.`cf_select_options` `op`
JOIN
`groupoffice`.`cf_ab_contacts` `cfc` ON `cfc`.`col_19` LIKE `Suchabfrage`
WHERE
`op`.`field_id` = 19
ORDER BY
`op`.`text` ASC
|
Alternativ kannst Du natürlich auch den CONCAT(...) an der Stelle einsetzen, wo ich den LIKE ... stehen habe. Zum Ausprobieren kannst Du auch mal ein "LEFT" vor das "JOIN" packen. Dann sollten mindestens so viele Zeilen rausfallen, wie in "cf_select_options" auf "field_id = 19" passen. Ciao robert PS: ich vermute, dass die Zeile 6 in Deinem ursprünglichen Posting ein Copy&Paste-Fehler ist.
|
strubi
(Themenstarter)
Anmeldungsdatum: 4. August 2010
Beiträge: 180
|
So, vielen Dank. Mit folgender Suchabfrage hat es funktioniert: 1
2
3
4
5
6
7
8
9
10
11
12
13
14 | SELECT
`op`.`text` AS `Arbeitsgruppe`,
`cfc`.`model_id` AS `Teamleiter ID`
FROM
`groupoffice`.`cf_select_options` `op`
JOIN
`groupoffice`.`cf_ab_contacts` `cfc` ON `cfc`.`col_19` LIKE CONCAT('%',`op`.`text`,'%')
WHERE
`op`.`field_id` = 19
ORDER BY
`op`.`text` ASC
|
Noch wegen dem Datenbank Design. Da kann ich leider nichts ändern. Es handelt sich um eine Datenbank einer Groupware. In der Groupware kann man eigene Felder generieren. Da gibt es dann auch die Möglichkeit Multiple Select Felder zu erstellen. Die Werte dieser Felder werden wie beschrieben in der DB abgelegt... Nun habe ich aber noch eine Frage.
Jetzt habe ich ja die Spalten der Arbeitsgruppe, und die Teamleiter ID. Mit dieser ID sollte ich aus der nächsten Tabelle die Namen der Teamleiter heraus bekommen. Wie mach ich diese Abfrage? Die Namen sind in der Tabelle
ab_contacts
Gespeichert. Aus dieser Tabelle benötige ich die Werte aus der Spalte:
id
first_name
last_name Das Feld "id" entspricht der ID die ich aus der Obigen Abfrage in der Spalte "Teamleiter ID" heraus gefiltert habe... Danke für die Hilfe Gruss strubi
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13219
|
strubi schrieb:
Jetzt habe ich ja die Spalten der Arbeitsgruppe, und die Teamleiter ID. Mit dieser ID sollte ich aus der nächsten Tabelle die Namen der Teamleiter heraus bekommen. Wie mach ich diese Abfrage?
Du hängst noch einen Join über die Id-Spalten an.
|
strubi
(Themenstarter)
Anmeldungsdatum: 4. August 2010
Beiträge: 180
|
Super! Ich glaube langsam wird das was. Mit dieser Abfrage hat es nun funktioniert: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | SELECT
`op`.`text` AS `Arbeitsgruppe`,
CONCAT(`con`.`first_name`, ' ', `con`.`last_name`) AS `Teamleiter`
FROM
`groupoffice`.`cf_select_options` `op`
JOIN
`groupoffice`.`cf_ab_contacts` `cfc` ON `cfc`.`col_19` LIKE CONCAT('%',`op`.`text`,'%')
JOIN
`groupoffice`.`ab_contacts` `con` ON `con`.`id` = `cfc`.`model_id`
WHERE
`op`.`field_id` = 19
ORDER BY
`op`.`text` ASC
|
Nun nur noch eine Frage. Mit der aktuellen Abfrage erhalte ich eine Liste mit allen Werten, solange in der Spalte "col_19" etwas steht. Nun benötige ich aber die ganze Liste. Wenn in "col_19" nichts steht, so müsste in "Teamleiter" einfach nichts stehen. Das ist wichtig um zu sehen, in welcher Arbeitsgruppe noch keine Teamleiter vorhanden sind. Danke und gruss strubi
|
misterunknown
Ehemalige
Anmeldungsdatum: 28. Oktober 2009
Beiträge: 4403
Wohnort: Sachsen
|
Dann nutze LEFT JOIN (denn JOIN meint immer INNER JOIN). Grafische Darstellung zum besseren Verständnis.
|
strubi
(Themenstarter)
Anmeldungsdatum: 4. August 2010
Beiträge: 180
|
Super! Jetzt hat es funktioniert. Vielen Dank! Danke auch für die Grafik. Die ist sehr nützlich. Die ganze Abfrage sieht nun so aus:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | SELECT
`op`.`text` AS `Arbeitsgruppe`,
CONCAT(`con`.`first_name`, ' ', `con`.`last_name`) AS `Teamleiter`
FROM
`groupoffice`.`cf_select_options` `op`
LEFT JOIN
`groupoffice`.`cf_ab_contacts` `cfc` ON `cfc`.`col_19` LIKE CONCAT('%',`op`.`text`,'%')
LEFT JOIN
`groupoffice`.`ab_contacts` `con` ON `con`.`id` = `cfc`.`model_id`
WHERE
`op`.`field_id` = 19
ORDER BY
`op`.`text` ASC
|
|