Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Ansatz für SQL Abfrage gesucht (https://www.delphipraxis.net/180925-ansatz-fuer-sql-abfrage-gesucht.html)

fillibuster 1. Jul 2014 13:09

Datenbank: MySQL • Version: 5 • Zugriff über: Unidac

Ansatz für SQL Abfrage gesucht
 
Hallo,

ich suche einen Ansatz für eine SQL Abfrage. Ich habe folgende (nicht mehr änderbare!!!) Tabellenstruktur:

projektnr|maschinenr|weitere Daten ...
456|333|weitere Daten ...
456|334|weitere Daten ...
456|335|weitere Daten ...
789|123|weitere Daten ...
789|124|weitere Daten ...

Rauskommen soll als Ergebnis die folgende Sortierung:

456|333,334,335| weitere Daten zu 333
789|123,124| weitere Daten zu 123

Vielen Dank!

mkinzler 1. Jul 2014 13:12

AW: Ansatz für SQL Abfrage gesucht
 
Mit der Aggregatsfunktion GROUP_CONCAT()

fillibuster 1. Jul 2014 13:48

AW: Ansatz für SQL Abfrage gesucht
 
Das ist es. Danke! :cheer:

fillibuster 9. Jul 2014 09:58

AW: Ansatz für SQL Abfrage gesucht
 
Hallo,

jetzt ist diesbezüglich noch eine Frage aufgetaucht. Ich habe die Tabelle etwas erweitert:

projektnr|maschinenr|weitere Daten ...
456|333|weitere Daten ...
456|334|weitere Daten ...
456|335|weitere Daten ...
789|123|weitere Daten ...
789|124|weitere Daten ...
987|333|weitere Daten ...
987|335|weitere Daten ...

Ich möchte jetzt nach den maschinennr. suchen, z. B.: 333 und 335 - also alle Projekte, die die Anlagen 333 und 335 enthalten. Das Ergebnis soll dann wieder so aussehen:

456|333,334,335| weitere Daten zu 333
987|333,335| weitere Daten zu 333

Da ich ja keine Projektnummer angebe muss ich die irgendwie gruppieren, um das so selektieren zu können, oder? Wie?

Danke!

mkinzler 9. Jul 2014 10:19

AW: Ansatz für SQL Abfrage gesucht
 
Oder weglassen, denn es sind ja verschiedene Projektnummern vorhanden

fillibuster 9. Jul 2014 10:31

AW: Ansatz für SQL Abfrage gesucht
 
Hi,

das verstehe ich nicht so ganz. Ich brauch ja ggf. weitere Maschinen aus dem Projekt (s. 456 (334)) die aber nicht explizit im WHERE Teil auftauchen. :gruebel:

Dejan Vu 9. Jul 2014 10:45

AW: Ansatz für SQL Abfrage gesucht
 
Code:
select * from TabelleMitGruppen
 where GruppierteMaschinen like '%333%'
   and GruppierteMaschinen like '%456%'
Funktioniert nur, wenn es keine Maschinen mit >4 Stellen (z.B. 1333) gibt.

DeddyH 9. Jul 2014 10:55

AW: Ansatz für SQL Abfrage gesucht
 
Oder mit einem Subselect
SQL-Code:
SELECT
  ...
FROM
  Tabelle A
WHERE
  maschinenr = 333
  AND EXISTS(
    SELECT
      *
    FROM
      Tabelle
    WHERE
      maschinenr = 335
      AND projektnr = A.projektnr      
  )

fillibuster 9. Jul 2014 11:10

AW: Ansatz für SQL Abfrage gesucht
 
Hi,

da ein Subselect zu aufwändig wäre würde ich gern den Vorschlag von Deja Vu aufgreifen. Dabei habe ich aber das Problem, dass er die Spalte Maschinennummer nicht erkennt:
Code:
GROUP_CONCAT(tabelle.maschinenr SEPARATOR '', '') AS Maschinennummer

Dejan Vu 9. Jul 2014 11:12

AW: Ansatz für SQL Abfrage gesucht
 
Ja, dachte ich mir auch, aber..
1. ist das dann auf exakt 2 begrenzt und lässt sich nicht so leicht erweitern (geht aber).
2. ist das Ergebnis nicht das, was er will
3. ist es vermutlich schneller ;-)

Ich würde (auch wenn der Ansatz ziemlich hemdsärmelig ist) vermutlich meinen Ansatz verwenden. Nicht weil es meiner ist, sondern weil er so einfach ist, und er sich sehr leicht auf beliebig viele Maschinen erweitern lässt, bzw. auch auf Konstrukte wie: "Maschine 12 und 34, aber nicht 56. Oder aber 78".

Code:
select * 
from TabelleMitGruppen
Where (
      GruppierteMaschinen like '%12%'
  and GruppierteMaschinen like '%34%'
  and not GruppierteMaschinen like '%56%'
  )
or
  GruppierteMaschinen like '%78%'
Wobei ich diese 'GruppierteMaschinenSpalte' dann mit Kommata einschließen würde, sodaß die 'like' Klausel sicherer wird:
Code:
select * 
from TabelleMitGruppen
Where GruppierteMaschinen like '%,12,%'
Dann dürfen auch Maschinen '123' drin vorkommen.


Oder man macht es so:
Code:
select * from
  (
    select ProjektNr,
           sum (iif(Maschinen in (12,34,56),1,0) as Cnt
      from Tabelle
     where Maschinen in (12,34,56)
) x where c.Cnt=3
So richtig flott ist das aber auch nicht. Wie macht man eigentlich diese Art der Abfragen richtig? Ich würde einen fulltext auf die Spalte 'GruppierteMaschinen' packen, dann ist das richtig schnell.

@Fillibuster: So etwa

Code:
select * from
( select ProjektNummer, Group_Concat(...) as Maschinennummern....
  from ...
) x where x.Maschinennummern like =...


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:47 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz