ubuntuusers.de

Für diese Funktion musst du eingeloggt sein.

SQL Abfrage

Status: Gelöst | Ubuntu-Version: Kubuntu 13.10 (Saucy Salamander)
Antworten |

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

1
`cfc`.`col_19`

Stehen unter Umstände mehrere Werte in der Form von "Wert 1|Wert 2|Wert 3" etc.

Wenn ich den suchwert mit

1
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

Avatar von 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 Team-Icon

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

1
`cfc`.`col_19`

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 Team-Icon

Ehemalige
Avatar von misterunknown

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 Team-Icon

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 Team-Icon

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 Team-Icon

Ehemalige
Avatar von misterunknown

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
Antworten |