[MySQL 4.1] Subtraktion von Resultaten?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [MySQL 4.1] Subtraktion von Resultaten?

    Das Problem ist folgendes: Es existieren 3 Menüs, denen Artikel zugeordnet werden. Jetzt sollen sämtliche Artikel aus der Datenbank gelesen werden, die nirgends zugeordnet wurden.

    Also dachte ich mir, ich lese einfach sämtliche Artikel aus der Datenbank und substrahiere vom Resultat die entsprechend zugeordneten Artikel gemäß dem Schema:
    Code:
    SELECT article_id FROM Artikel - SELECT article_id FROM MENU_1 - SELECT article_id FROM MENU_2...
    Daraufhin habe ich das MySQL-Referenzhandbuch durchwühlt, konnte aber nirgends eine entsprechende Möglichkeit entdecken. Wie lässt sich dies mittels MySQL realisieren?
    [COLOR=red]Gesellschaftsforum.net[/COLOR] - Projekt zur Wiederbelebung der Diskussionskultur im Internet
    [COLOR=orange]1st News[/COLOR] - Das Newsletterscript für den professionellen Einsatz

  • #2
    Re: [MySQL 4.1] Subtraktion von Resultaten?

    SELECT * FROM tabelle1 a LEFT JOIN tabelle2 b USING(id) WHERE b.id IS NULL;
    SELECT * FROM tabelle1 a WHERE (SELECT COUNT(*) FROM tabelle2 b WHERE b.id = a.id) = 0;
    (wobei der JOIN wahrscheinlich schneller ist)

    aber... wieso legst du 3 Tabellen für ähnliche Daten an? Wäre es nicht besser alle 3 "Menüs" in einer Tabelle zu vereinen?!

    Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

    bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
    Wie man Fragen richtig stellt

    Kommentar


    • #3
      Re: Re: [MySQL 4.1] Subtraktion von Resultaten?

      Danke erstmal, scheint insofern zu funktionieren.

      Original geschrieben von ghostgambler
      aber... wieso legst du 3 Tabellen für ähnliche Daten an? Wäre es nicht besser alle 3 "Menüs" in einer Tabelle zu vereinen?!
      Aufgrund der unterschiedlichen Funktionsweisen sowie den verzweigten Abhängigkeiten.

      Menü 1 funktioniert gemäß Parent-Modell, Menü 2 wiederum gemäß Modell Nested Set. Zudem werden die Menüpunkte des 2. Menüs zu Sets zusammengefügt, die dann wiederum Menüpunkten des 1. Menüs zugeordnet werden. Zudem ist es erforderlich, dass ich mittels einer einzelnen Variable einen Menüpunkt des 1. Menüs und einen Menüpunkt des 2. Menüs referenzieren kann (einfache Kreuzung zur Referenzierung mittels separaten Keys). Menü 3 hingegen ist lediglich eindimensional.

      Aufgrund dieser Komplexität erschien mir die Aufteilung in 3 Tabellen sinnvoller.
      [COLOR=red]Gesellschaftsforum.net[/COLOR] - Projekt zur Wiederbelebung der Diskussionskultur im Internet
      [COLOR=orange]1st News[/COLOR] - Das Newsletterscript für den professionellen Einsatz

      Kommentar


      • #4
        Du könntest prinzipiell einfach alle Menüs über Nested Sets realisieren wenn du sowieso schon eine Tabelle damit hast.
        Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

        Kommentar


        • #5
          So, ein kleines Problem bezüglich dieser Problematik hat sich dann doch noch ergeben:

          Ich kreuze die Tabellen zweier Menüs und speichere das Ergebnis in einer separaten Tabelle ab:
          Code:
          INSERT INTO `content_assignment` (menu_top_id, menu_side_entry_id) SELECT b.menu_top_id, a.menu_side_entry_id FROM `menu_side` a LEFT JOIN `menu_top` b ON a.menu_side_setid = b.menu_side_setid
          Insofern auch kein großartiges Problem. Jetzt möchte ich dieser separaten Tabelle jedoch lediglich Einträge hinzufügen, die in dieser Kombination aus den beiden Primärschlüsseln der Menütabellen noch nicht enthalten sind:

          Code:
          SELECT b.menu_top_id, a.menu_side_entry_id FROM `menu_side` a JOIN `menu_top` b ON a.menu_side_setid = b.menu_side_setid LEFT JOIN `content_assignment` c ON b.menu_top_id = c.menu_top_id WHERE b.menu_side_entry_id = c.menu_side_entry_id AND c.content_id IS NULL
          Das Problem ist, dass durch die WHERE-Klausel der letzte LEFT JOIN in einen einfachen JOIN uminterpretiert wird, weshalb mir eben jene Resultate, welche nicht in der letzten Tabelle enthalten sind innerhalb der Abfrage verloren gehen.

          Kurz zu Erklärung:
          Code:
          SELECT b.menu_top_id, a.menu_side_entry_id FROM `menu_side` a JOIN `menu_top` b ON a.menu_side_setid = b.menu_side_setid
          Liefert alle Einträge, welche in `content_assignment`enthalten sein sollten.

          [code]
          Code:
          SELECT b.menu_top_id, a.menu_side_entry_id FROM `menu_side` a JOIN `menu_top` b ON a.menu_side_setid = b.menu_side_setid LEFT JOIN `content_assignment` c ON b.menu_top_id = c.menu_top_id WHERE b.menu_side_entry_id = c.menu_side_entry_id
          Liefert leider nur die Einträge, welche enthalten sind.

          Edit: Hat sich erledigt. Der Versuch 2 Bedingungen innerhalb der ON-Klausel zu platzieren war erstaunlicherweise von Erfolg gekrönt.
          Zuletzt geändert von Crake; 04.10.2007, 00:26.
          [COLOR=red]Gesellschaftsforum.net[/COLOR] - Projekt zur Wiederbelebung der Diskussionskultur im Internet
          [COLOR=orange]1st News[/COLOR] - Das Newsletterscript für den professionellen Einsatz

          Kommentar


          • #6
            ganz spontan wär mir da folgendes eingefallen

            SELECT .... MINUS SELECT ....

            Kommentar


            • #7
              Original geschrieben von BugBite
              ganz spontan wär mir da folgendes eingefallen

              SELECT .... MINUS SELECT ....
              Bitte?

              Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

              bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
              Wie man Fragen richtig stellt

              Kommentar


              • #8
                vielleicht verwechsel ich da was mit oracle sql aber ich dachte das geht by mysql auch

                SELECT * FROM mitarbeiter MINUS
                SELECT * FROM mitarbeiter WHERE age > 18

                resultat wäre dann alle mitarbeiter unter 18

                Kommentar


                • #9
                  Ich glaube du verwechselst das mit Oracle.
                  Zumindest kannte ich das bisher nicht, sehe es auch zum ersten Mal in meinem Leben, und konnte auch im Manual gestern kurz nichts finden.

                  Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                  bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                  Wie man Fragen richtig stellt

                  Kommentar


                  • #10
                    oh ja da hast natürlich recht =/

                    der link hier zeigt wie man ein minus in mysql machen kann

                    edit: der link
                    http://www.bitbybit.dk/carsten/blog/?p=71

                    Kommentar

                    Lädt...
                    X