• Also, wie auf dem Bild zusehen habe ich 3 Tabellen.

    Ich bräuchte eine Abfrage die mir, general.host und software_check.name zurückgibt.
    Dabei sollen nur die Einträge zurückgegebenwerden die nicht in der Tabelle software_installed geführt sind.

    Kurz gesagt, ich will wissen welche Software auf welchem Rechner NICHT installiert ist.
    [Anmerkung: software_installed listet nur was wirklich installiert ist, software_check listet alles was überprüft wird]

    Bin leider noch ziemlich unerfahren was SQL angeht und wäre für einen Tipp wie man das Problem angeht sehr dankbar.

    autoit.de/wcf/attachment/7481/

  • Eventuell so?

    SQL
    SELECT g.mac As `mac`, g.host As `host`, c.id As `softwareid`  FROM `general` g LEFT JOIN `software_installed` i ON g.mac = i.mac LEFT JOIN `software_check` c ON i.softwareid != c.id
  • Nein leider nicht. Mit LEFT-JOIN hatte ich auch schon ein paar Versuche gestartet. Trotzdem Danke.

    Wenns gar nicht anders geht, werde ichs wohl etwas umbasteln müssen. Also die Tabelle software_installed.

  • Also, das funktioniert jetzt aber ob das gutes SQL ist, ist die andere Frage:

    SQL
    SELECT g.mac As `mac`, g.host As `host`, c.* FROM `general` g LEFT JOIN `software_check` c ON 1=1 WHERE NOT EXISTS (SELECT i.id FROM `software_installed` i WHERE i.computerid = g.id And i.softwareid = c.id)


    Die Tabellen:
    general: id, mac, host
    software_check: id, name
    software_installed: id, computerid, softwareid

  • Hab es jetzt anders gebaut auch wenn ich nciht wirklich glücklich mit der Lösung bin weils zu viel mehr einträgen führt.

    In Software_installed wandert jetzt jeder zu prüfende Eintrag rein, ist die Software allerdings nicht installiert wird die versionsnummer auf 0 gesetzt.

    Abfragen was installiert ist:
    SELECT C.host, A.name, B.version
    FROM general AS C
    JOIN software_installed AS B
    ON C.mac=B.mac
    JOIN software_check AS A
    ON B.softwareid=A.id
    Where B.version<>'0' [AND B.mac='XX:XX']

    Nicht installiert:
    SELECT C.host, A.name, B.version
    FROM general AS C
    JOIN software_installed AS B
    ON C.mac=B.mac
    JOIN software_check AS A
    ON B.softwareid=A.id
    Where B.version='0' [AND B.mac='XX:XX']

    Ob das so 100% sauber ist weiß ich auch nicht, aber funktioniert jedenfalls und es waren nur 2 Zeilen Quellcode zu ändern ;P

  • Da ich leider keine Datenbank habe mit der ich das testen kann kann ich dir erstmal nur einen Tip geben.

    Versuche es erstmal nur mit Tabelle 2 und 3 ohne noch die MACadresen zu Joinen.
    Ich nehme mal an das es so geht.

    SQL
    SELECT * FROM `software_check`, `software_installed` WHERE `softwareid`. `software_installed` <> `id`.`software_check`

    Dies sollte das Gegenteil eigentlich anzeigen:

    SQL
    SELECT * FROM `software_check`, `software_installed` WHERE `softwareid`. `software_installed` = `id`.`software_check`

    MfG
    Der_Doc

  • Dachte auch erst es wäre so einfach, aber in der Bedingung mit dem ungleich liegt ein Denkfehler.

    Dadurch wird ein Eintrag von software_installed mit allen Einträgen von software_check verknüpft, nur mit einem nicht: wo id und softwareid gleich sind.
    Ergebnis ist dann eine riesen Tabelle ohne aussagekraft. Dadurch ändert sich auch die Dauer der Abfrage "erheblich":

    Deine obere Abfrage: 0.0162 sek ~ 13.000 Ergbenisse
    Meine obere Abfrage: 0.0015 sek (obwohl 'komplexer') ~800 Ergebnisse
    Achja, habs jetzt nur einmal ausprobiert, von daher ist der Zeitwert sicher noch etwas unpräzise

    Durch die optionale Angabe der MAC in der WHERE Bedingung kann man bestimmen ob man die Informationen nur von einem Rechner oder von allen haben möchte.

    Die verknüpfung mit der dritten Tabelle ist nötig damit ich auch den Hostnamen ohne zusätzliche Abfragen bekomm.

  • Aber du möchtest doch alle software haben die nicht installiert ist.
    Und ich nehme an du machst den Abgleich über die software_ckeck oder?

    Also möchtest du doch alle Ergebnise haben die keine ID in software_install hat oder?

    Gibt es net mal ein paar Testdaten?
    Ich habe morgen an der Arbeit nen bischen Zeit und ich glaube auch ne Datenbank mit der ich das testen kann.

    MfG
    Der_Dco