Flashhilfe.de - Flash Community

MySQL Abfrage zusätzliche Where Bedingung

 


AntwortenRegistrieren Seite1  

coloneltw#1
Benutzerbild von coloneltw
Beiträge: 11
Registriert: Mar 2010

08.06.2010, 09:50

Hallo an alle und vielen Dank schonmal für Eure Antworten,
ich hbe hier ein kleines Problem mit dem ich nicht weiterkomme. ich versuche aus 2 Tabellen einen Select zu bauen. Tabelle eins beinhaltet die Installierte Software auf jeden PC/Server. Tabelle 2 hat informationen zu der Hardware.
Leider sind die Hersteller der Software bei der Entwicklung nicht wirklich darauf bedacht ihre Produkte einfach unterscheiden zu können.
Daher muss ich per SQL diese Aufgabe übernehmen.

Ich versuche einen SQL Server 2005 Standard Edition vom SQL Server 2005 Standard Express zu unterscheiden. Der eine kostet Geld der andere nicht. In der Softwaretabelle tauchen beide Produkte gleich mehrmals auf. Leider installieren sich beide Produkte als Microsoft SQL Server 2005. Die Express variante hat dann noch einen Eintrag für Express. Wie kann ich in MySQL beide Werte miteinander verbinden.
Bei meinem Code kommen viele Ergebnisse heraus.

ActionScript:
1
2
3
4
5
6
7
8
9
# SQL Server 2005
SELECT distinct concat(tmp_csv2table_hardware.col_name,'_sql') as import_id, 'mmw_ads' as import_data_source_id, tmp_csv2table_hardware.col_name as import_device_id,
       '4006' as import_product_id, tmp_csv2table_hardware.col_processorn as quantity
  FROM    smarttrack_prod.tmp_csv2table_hardware tmp_csv2table_hardware
       INNER JOIN
          smarttrack_prod.tmp_csv2table_software tmp_csv2table_software
       ON (tmp_csv2table_hardware.col_id =
              tmp_csv2table_software.col_id)
WHERE tmp_csv2table_software.col_name = 'Microsoft SQL Server 2005' AND tmp_csv2table_software.col_name != 'Microsoft SQL Server 2005 Express Edition (SQLEXPRESS)'


Die Spaltennamen müssen so sein, da die Ausgabe in eine CSV geschrieben wird, welche dann von einer anderen Software eingelesen wird. Diese hat alle unsere Lizenzen und kann dann diese auf die Installationen zuordnen. Am Ende haben wir eine Lizenzbilanz. Aber wie gesagt dazu muss ich diese Unterscheidungen vornehmen. Leider gibt es beim kostenpflichtigen SQL Server 2005 keinen Eintrag der nicht auch unter der Express Variante auftaucht. Nur das Express in der Express Version ist der Unterschied.
Vielen Dank schonmal
Werbung
Beiträge: 0
Registriert: Feb 2016


coloneltw#2
Benutzerbild von coloneltw
Beiträge: 11
Registriert: Mar 2010

Themenautor/in

08.06.2010, 10:15

Habe einen Workaround gefunden. Wenn jemanden etwas einfällt fände ich es toll da ich das gleiche Problem auch woanders habe.
In diesem speziellen Fall gibt es bei SQL Server 2005 2 Einträge, einer mit ner Versionsnummer. Der SQL 2005 Eintrag bei Express hat keine. Daher habe ich die Abfrage mit AND Version > '0' erweitert, jetzt löst er es richtig auf. Es ist aber Zufall das MS sich wenigstens bei version mit einträgt.
Bei vielen anderen Sachen klappt das nicht.
Von daher würde ich mich sehr freuen wie ich in der Where Klausel mehrere vokommende Dinge aus einer Tabelle miteinander verknüpfen kann.
Von der Logik her dann
Where Eintrag=SQL 2005 aber nicht Eintrag=SQL 2005 Express
Diesen Ausschluss bekomme ich nicht hin.
coloneltw#3
Benutzerbild von coloneltw
Beiträge: 11
Registriert: Mar 2010

Themenautor/in

10.06.2010, 09:48

habe das problem auch an anderer Stelle, kann mir da keiner helfen?
jomac#4
Benutzerbild von jomac
Beiträge: 89
Wohnort: CH
Registriert: Jun 2010

10.06.2010, 10:09

Kannst du bitte einmal einen Ausschnitt aller betroffenen Tabellen hochladen?
Es ist generell einfacher wenn man eine bessere Übersicht hat und man sieht schneller wo genau das Problem liegt, als sich zuerst in deine Situation reinzudenken.
Werbung
Beiträge: 0
Registriert: Feb 2016


coloneltw#5
Benutzerbild von coloneltw
Beiträge: 11
Registriert: Mar 2010

Themenautor/in

10.06.2010, 12:06

Hallo Jomac,
ich werde es versuchen.
Ich kann es aber zuvor gern einmal ohne Tabellen erklären.

Ich habe eine Abfrage --> Zeige das und das von dort und dort wenn Bedingung 1 erfüllt ist.

Das funktioniert prächtig.

Nun möchte ich das so umbauen.

Suche Tabelle1.Spalte1 und Tabelle2.Spalte2
Von Tabelle1 und Tabelle2
Wo Tabelle 2.Spalte3 = "Wert1" es sei denn Tabelle2.Spalte3="Wert2"

Nun zu den Tabellen

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Adobe Acrobat 8
SELECT concat(tmp_csv2table_hardware.col_name,'_191') as import_id, 'mmw_ads' as import_data_source_id, tmp_csv2table_hardware.col_name as import_device_id,
       '191' as import_product_id, '1' as quantity
  FROM    smarttrack_prod.tmp_csv2table_hardware tmp_csv2table_hardware
       INNER JOIN
          smarttrack_prod.tmp_csv2table_software tmp_csv2table_software
       ON (tmp_csv2table_hardware.col_id =
              tmp_csv2table_software.col_id)

WHERE tmp_csv2table_software.col_name = 'Adobe Acrobat 8 Professional - English, Français, Deutsch'
   OR tmp_csv2table_software.col_name = 'Adobe Acrobat 8.1.0 Professional'
   OR tmp_csv2table_software.col_name = 'Adobe Acrobat 8.1.2 Professional'
   OR tmp_csv2table_software.col_name = 'Adobe Acrobat 8.2.0 - CPSID_52074'
   OR tmp_csv2table_software.col_name = 'Adobe Acrobat 8.2.0 Professional'



Hier verknüpfe ich unsere Hardwaretabelle mit der Softwaretabelle

die Spalten col_id sind die Gemeinsamkeiten. Sprich Jedes Endgerät hat eine ID und zu jeder ID gehören die Programme die installiert sind. Das sind ne ganze Menge (550 Endgeräte und insgesamt 86000 installierte Produkte). Ich durchforste die Softwareliste nach Software. Wenn ich nun ein Adobe 8 Professional entdecke, soll er den dazu gehörenden PC Namen mit der Produktnummer dieses Produktes verknüpfen. Die Produktnummer bekomme ich manuell woanders her.
Nun ist es aber bei einigen Produkten so, dass er das produkt anzeigt, es aber zu einem anderen gehört.
Beispiel Adobe Designer 5. Zu diesem Paket gehört ein Adobe Professional 9, sprich bei der Installation installiert er beides und zeigt auch beides an. Mein SQL String würde nun sowohl das eine als auch das andere finden und aufzeichnen bzw. in dem Tool für das ich das mache je eine Lizenz verbraten. Also muss ich für einige Produkte diesen Ausschluss bilden, zeige mir das an wenn du Adobe Acrobat 8 findest, es denn auf der gleichen ID ist auch der Designer 2 vorhanden. Oder eine Version höher mit Designer 5 und Pro 9.

Ich schätze ich muss in der Where Klausel eine Unterabfrage einbauen, habe aber keinen Plan wie.
Bin mit SQl nicht so bewandert, die meisten Sachen habe ich mir selbst angeeignet. Diese InnerJoins aber stammen nicht von mir, ich nutze Toad for Mysql um die Abfragen zusammenzuschustern.

Ich kann den SQL String auch nicht unendlich verkomplizieren, da dieser String einer von über hundert ist die mit Union All den gesammten Installationsbestand des Unternehmens wieder geben.

ich hoffe das hilft dir weiter zu verstehen was ich möchte. tabelle.zip (2.14 KB)
Geändert von coloneltw am 10.06.10 um 12:06 Uhr
jomac#6
Benutzerbild von jomac
Beiträge: 89
Wohnort: CH
Registriert: Jun 2010

10.06.2010, 14:08

*seufz*, mit einem Ausschnitt aus den betroffenen Tabellen habe ich eigentlich ein Dump gemeint, denn damit ersparst du jedem, der dir helfen will sehr viel Arbeit, für ein nächstes Mal.
Da col_id nicht übereinstimmen, es eine Excel-Tabelle ist und SQL-Express... gar nie vorkommen bringt das rein gar nichts, sry ;)

Was genau nicht funktioniert ist nicht klar und es wäre mit einem Dump um einiges schneller gegangen, denn folgendes ist klar:
ActionScript:
1IF val1 != val2 && table2.col3 == val1 THEN (table2.col3 != val2) == true ELSE false

Kurz und gut die Abfrage macht keinen Sinn, denn wenn table2.col3 == val1 und val1 != val2 folgt automatisch dass table2.col3 != val2
coloneltw#7
Benutzerbild von coloneltw
Beiträge: 11
Registriert: Mar 2010

Themenautor/in

10.06.2010, 14:24

Ja ich habe nur die je ersten beiden Zeilen genommen da das ganze wie gesagt sehr groß ist.
Habe in etwa auch eine Lösung, ein Kollege war sehr nett. Diese Lösung ist allerdings das Grauen einer jeden Datenbank aber es funktioniert.
Habe daher meinen Server mal auf 4 CPUs upgegraded die wird er brauchen wenn davon noch mehr kommen.

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Adobe Acrobat 8
SELECT distinct concat(tmp_csv2table_hardware.col_name,'_191') as import_id,
                      'mmw_ads' as import_data_source_id,
                      tmp_csv2table_hardware.col_name as import_device_id,
                      '191' as import_product_id, '1' as quantity
FROM    smarttrack_prod.tmp_csv2table_hardware tmp_csv2table_hardware
INNER JOIN
           smarttrack_prod.tmp_csv2table_software tmp_csv2table_software
ON       (tmp_csv2table_hardware.col_id =
           tmp_csv2table_software.col_id)

WHERE substring(tmp_csv2table_software.col_name,1,15) = 'Adobe Acrobat 8'
    AND tmp_csv2table_hardware.col_name
    not in
    (SELECT distinct tmp_csv2table_hardware.col_name
     FROM    smarttrack_prod.tmp_csv2table_hardware tmp_csv2table_hardware
     INNER JOIN
                smarttrack_prod.tmp_csv2table_software tmp_csv2table_software
     ON       (tmp_csv2table_hardware.col_id =
                tmp_csv2table_software.col_id)
     WHERE tmp_csv2table_software.col_name = 'Adobe Creative Suite 2')

jomac#8
Benutzerbild von jomac
Beiträge: 89
Wohnort: CH
Registriert: Jun 2010

10.06.2010, 14:37

Wenn die Lösung für dich geht dann ist ja gut, wenn du noch was anderes suchst, dann beschreibe doch noch einmal in der Art

Suche Tabelle1.Spalte1 und Tabelle2.Spalte2
Von Tabelle1 und Tabelle2
Wo Tabelle 2.Spalte3 = "Wert1" es sei denn Tabelle2.Spalte3="Wert2"

was genau du willst und zwar nicht nur einen Ausschnitt daraus. Als erleichterung am Besten mit Dump.

Am Anfang ging es um eine Unterscheidung von Express und nicht Express in deiner letzten SQL-Query suchst du alle tmp_csv2table_hardware.col_name , wo nicht auch noch 'Adobe Creative Suite 2' in einem beliebigen tmp_csv2table_software.col_name mit dem selben tmp_csv2table_hardware.col_name vorkommt. Das ist nicht ganz das selbe.
coloneltw#9
Benutzerbild von coloneltw
Beiträge: 11
Registriert: Mar 2010

Themenautor/in

16.06.2010, 10:51

>Das ist nicht ganz das selbe.

doch im Prinzip schon. Im Prinzip habe ich eine Tabelle mit Eigenschaften die diversen IDs zugeordnet sind.
In der anderen Tabelle habe ich zu den IDs die Informationen wie Name etc.
Nun suche ich im Normalfall einfach nur zu jeder Eigenschaft, alle IDs bzw. Namen welche diese haben.
Nun gibt es aber manche Eigenschaften die eine ID hat aber im Prinzip doch nicht hat nur leider steht das so in der Tabelle.
Wenn man Office 2010 Beta installiert taucht in der Software einmal Office 2010 und einmal Office 2010 Beta auf. Sprich laut der ersten Regel beinhaltet der PC sowohl Office 2010 als auch die Beta davon. Das stimmt aber nicht, Office trägt sich nur so ein. Darum muss ich genau diese herausfiltern.

Das versuche ich mit not in und dann einer Unterabfrage, was aber gehörig auf die Performance geht.

Das Motto heisst dann, zeige alle Endgeräte die Eigenschaft1 haben aber nicht die die Eigenschaft1 und 2 haben.

Mit not in kann ich das tun, die Frage ist gibt es einen Weg der nicht 20 Minuten Bearbeitungszeit benötigt, da ich diesen Schritt ungefähr 100mal machen muss. Ich habe ganz viele Select mit UNION ALL Abfragen hintereinander. Tendenz steigend. ich sollte also darauf achten das der Einzel Query nicht allzulange mit Unterabfragen aller not in beschäftigt ist.

Aber trotzdem vielen Dank für deine Hilfe bisher.
jomac#10
Benutzerbild von jomac
Beiträge: 89
Wohnort: CH
Registriert: Jun 2010

16.06.2010, 13:55

"Das ist nicht ganz dasselbe" war Ironie. Es ist etwas komplett anderes.
Dein erstes Beispiel war
ActionScript:
1WHERE tmp_csv2table_software.col_name = 'Microsoft SQL Server 2005' AND tmp_csv2table_software.col_name != 'Microsoft SQL Server 2005 Express Edition (SQLEXPRESS)'

tmp_csv2table_software.col_name wird dabei mit einem String verglichen und nicht mit not in [ARRAY]
Zur Performance gibt es eine einfache Möglichkeit wie du die noch etwas verbessern kannst. Je nach grösse der Tabelle sogar sehr stark. Setze deine Joins ans Ende. Dadurch kannst du extrem viel Zeit gewinnen, da somit die temporäre Tabelle viel Kleiner wird. Hier noch ein Link dazu.
coloneltw#11
Benutzerbild von coloneltw
Beiträge: 11
Registriert: Mar 2010

Themenautor/in

16.06.2010, 14:58

Hallo Jomac
das mit dem not in ist ja auch nur der Workaround der zwar funktioniert aber viel zeit verschlingt.
Ich hätte gern eine andere Lösung die eventuell schneller läuft.
Wenn ich select starte und bei jedem 2. select ein Unterselect mittels not in einleite und das ganze bei ca. 100 Selects mit Union All also 50 not ins, die dann auf eine Tabelle mit 87000 Datensätzen zugreifen wird die gesamte Abfrage mehrere Stunden dauern.
Ist halt sehr schwer da meine Quellen eigentlich nicht in der Form für relationale Datenbanken vorliegen.
Ich muss aus einem wüst an Daten irgendwas brauchbares generieren und muss dazu immer wieder Verknüpfungen mit vielen Tabellen herstellen.
Daher auch die Anfrage in dem anderen Thread wegen dem Multicores.
Das mit dem Link und den Joins nach hinten verlagern habe ich nicht ganz verstanden. Wie meinst du das genau?

AntwortenRegistrieren Seite1  

Schnellantwort

Du musst registriert sein, um diese Funktion nutzen zu können.

 
Ähnliche Beiträge zum Thema
Partner Webseiten: art-and-law.de  Mediengestalter.info   php-resource.de   phpforum.de   phpwelt.de   Pixelio.de   Scubacube.de  
Haftungsausschluss   Datenschutzerklärung   Hier Werben   Impressum
© 1999-2019 Sebastian Wichmann - Flashhilfe.de