Left Join Problem - Zeilen filtern...

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

  • Left Join Problem - Zeilen filtern...

    Warum funktioniert das nicht? Ich will alle Zeilen aus articles haben, die nicht in users_rollen stehen...

    SELECT A.*
    from users_rollen A
    left join articles B
    on A.idcat=B.idcat
    where B.idcat is null AND A.iduser = 13

    Und: Sollte phpmyadmin wenn ich die abfrage ohne "where B.idcat is null" mache nicht auch die "null"er anzeigen? tut er net...

  • #2
    Bin mir da jetzt nicht so sicher aber wie soll das denn gehen:
    on A.idcat=B.idcat
    where B.idcat is null AND A.iduser = 13

    Bei dem "on" verlangst du, dass A.idcat = B.idcat ist und im "where" verlangst du dass sie unterschiedlich, bzw. das eine 0 und das andere 13 ist.

    Kommentar


    • #3
      Ein original beispiel von www.little-idiot.de:

      Code:
          mysql> SELECT a.ort, a.id AS p_in_o, b.id AS p_in_n
             --> FROM a LEFT JOIN b
             -->      ON a.id = b.id
             --> WHERE b.id IS NULL
             --> ORDER BY p_in_o, p_in_n;
          +---------+--------+--------+
          | ort     | p_in_o | p_in_n |
          +---------+--------+--------+
          | passau  |      1 |   NULL |
          | münchen |      2 |   NULL |
          +---------+--------+--------+
      ... und da funktioniert es...

      Kommentar


      • #4
        Ja da kann es funktionieren.

        ON a.id = b.id
        WHERE b.id IS NULL

        Das ON ist ja schon korrekt. Du kannst auch b.id (in deinem Fall B.idcat) in eine bedingung setzen. Dann darfst du aber nicht noch A.idcat auf einen anderen Wert begrenzen. Wird im Beispiel übrigens auch nicht gemacht.

        Versuche es doch einmal so:
        SELECT A.*
        from users_rollen A
        left join articles B
        on A.idcat=B.idcat
        where B.idcat is null;

        oder so:
        SELECT A.*
        from users_rollen A
        left join articles B
        on A.idcat=B.idcat
        where A.iduser = 13;
        Zuletzt geändert von gringo; 22.06.2005, 10:53.

        Kommentar


        • #5
          Ok, ich habe nun eine tmp Tabelle gemacht, in der es nur den User "13" gibt, und folgende SQL-Abfrage gemacht:

          Code:
          SELECT A.*
          from articles A 
          left join users_rollen_tmp B 
          on A.idcat=B.idcat 
          WHERE B.idcat is null
          Diese funktioniert auch, aber das Problem ist nun einfach, dass in der users_rollen mehrere user stehen, und ich unbedingt zwischen denen unterscheiden muss.

          Kommentar


          • #6
            Kannst du mal die Struktur deiner Tabellen aufzeigen?

            Kommentar


            • #7
              danke schonmal, dass du du so behilflich bist ;-)

              Meine Tabellen (ich hoffe das meintest du):
              users_rollen :

              Code:
              CREATE TABLE `users_rollen` (
                `id` int(11) unsigned NOT NULL auto_increment,
                `iduser` int(11) NOT NULL default '0',
                `idcat` int(6) NOT NULL default '0',
                `idlang` int(6) NOT NULL default '0',
                PRIMARY KEY  (`id`),
                UNIQUE KEY `iduser` (`id`)
              ) TYPE=MyISAM AUTO_INCREMENT=562 ;

              tabelle articles:

              Code:
              CREATE TABLE `articles` (
                `idart` int(6) NOT NULL auto_increment,
                `idcat` int(6) NOT NULL default '0',
                `name` varchar(255) NOT NULL default '',
                PRIMARY KEY  (`idart`),
                UNIQUE KEY `idart` (`idart`)
              ) TYPE=MyISAM AUTO_INCREMENT=83 ;

              Kommentar


              • #8
                SELECT A.*
                from users_rollen A
                left join articles B
                on A.idcat=B.idcat
                where B.idcat is null AND A.iduser = 13

                Dein erster Post funktioniert bei mir problemlos. erhaltest du denn eine Fehlermeldung? Oder inwiefern "funktioniert" das nicht?

                Kommentar


                • #9
                  Ja, nein...

                  in meiner verzweifelung hab ich einfach mal alles getestet, und den falschen code gepostet...
                  Fakt ist, ich brauche alle Zeilen aus articles dessen idcat nicht in users_rollen vorkommt. Ich habe nämlich eine Ausgabe, bei der ich anzeigen will, für welche Artikel ein Unser keine Berechtigungen hat.

                  also es muss schon
                  SELECT A.*
                  from articles A
                  left join users_rollen B ...
                  sein, also so rum...

                  Kommentar


                  • #10
                    Subquery !

                    PHP-Code:
                    SELECT *
                    from articles 
                    where iduser 
                    13 AND  idcat NOT IN SELECT DISTINCT idcat FROM user_rollen where iduser 13
                    Sollte doch funktionieren um alle Artikelzeilen zu bekommen die nicht in user_rollen sind
                    chansel0049
                    ----------------------------------------------------
                    if you've reached the bottomline - dig further!
                    Übersetzer gesucht? http://www.babelport.com

                    Kommentar


                    • #11
                      Klasse Sache son ein Subquery, aber ich muss komplett ohne auskommen, da meine mysql-version nicht grad die neueste ist, und sie nicht so schnell von unserer technik geändert wird.
                      Das muss doch noch irgendwie anders gehen... echt komisch...

                      Kommentar


                      • #12
                        DU hast doch nur 3 Bedingungen:
                        1. Die Datensätze sind über idcat verknüpft
                        2. Der User hat die ID x
                        3. Der User soll diese idcat nicht besitzen


                        Da die die Artikel haben willst, die der User nicht bearbeiten oder was auch immer darf, muss die Tabelle articles die linke Tabelle im LEFT JOIN sein:
                        Code:
                        SELECT a.idart, a.idcat, a.name
                        FROM articles a
                          LEFT OUTER JOIN users_rollen u ON <join-bedingung>
                        WHERE <where-bedingung>
                        Bedingung 1 gehört auf jeden Fall in den JOIN.
                        Bedinung 3 ist das Prüfen auf IS NULL und gehört ins WHERE.
                        Ergebnis:

                        Code:
                        SELECT a.idart, a.idcat, a.name
                        FROM articles a
                          LEFT OUTER JOIN users_rollen u ON 
                            a.idcat = u.idcat 
                        WHERE u.iduser IS NULL
                        Fehlt nur noch Bedingung 2.
                        Die kann entweder in den ON-Teil des JOINs oder in den WHERE-Teil.

                        Im WHERE müsste iduser dann aber gleichzeitig NULL und x sein, was schwerlich möglich sein wird => Bedingung 2 gehört in JOIN
                        Code:
                        SELECT a.idart, a.idcat, a.name
                        FROM articles a
                          LEFT OUTER JOIN users_rollen u ON 
                            a.idcat = u.idcat AND 
                            u.iduser = [i]x[/i]
                        WHERE u.iduser IS NULL

                        Was war so schwer?
                        Ich denke, also bin ich. - Einige sind trotzdem...

                        Kommentar


                        • #13
                          hehe, wenn man weiß wie's geht nicht...
                          Danke dir

                          Kommentar

                          Lädt...
                          X