Abfrage in einer Funktion vereinfachen?

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

  • Abfrage in einer Funktion vereinfachen?

    Hallo und schönen Sonntag erstmal.

    Ich ahbe hier nun lange gesucht und auch im MySQL Manual. Leider bin ich auf nichts gestossen das mir da weiterhelfen kann. Ich hoffe jemand von euch weiss da rat.

    Ich weiss nicht ob dies möglich ist. Aber ich hoffe da ich so sehr viel weniger Abfragen benötige:

    Ich habe einerseits diese Abfrage:

    SELECT did, cid, title FROM c1

    Dann verarbeite ich die dateien in WHILE und in der WHILE habe ich diese Abfrage:

    SELECT did, aid, bid FROM e1 WHERE did='did_aus_der_vorherigen_abfrage'

    Nun arbeite ich noch in der WHILE damit. Also eine < > abfrage. wenn da mal did keinen wert hat sind einfach aid udn bid eigentlich 0 bez "" ist ja klar und alles funktioniert.
    Da dies in der WHILE ist und wenn die erste abfrage 50 ergebnise hat, habe ich mit dieser zweiten Abfrage 50 SQL Abfragen wo ggf unnötig sind.

    Also habe ich es versucht eine daraus zu machen und wolte dann einfach zur ersten ungefähr dies machen:
    LEFT JOIN e1 ON (c1.did=e1.did).

    Und jetzt genau das Problem. Soweit ja so gut funktioniert.
    Aber eben nicht ganz
    Wenn nun e1 KEINEN eintrag zu diesem c1.did hat, führt er diese abfrage dann nicht aus logischerweise. Ist es nun möglich da trotzdem eine Abfrage zu machen, und ihm halt zu sagen das er dieses nur ausführt wenn auch ein wert vorhanden ist? Denn sonst führt er mir nicht alle aus, und wenn ich dies nicht drin habe kann ich nachher nicht mti e1.did arbeiten für die < > abfrage.

    Ich hoffe ich konnte es einigermassen gut erkläre. Wenn noch was unklar ist probiere ich es gerne etwas besser zu erklären.

    Gruss

    kari_w

    Ich habe gelernt die Beiträge nicht mehr weg zu editieren Wollt ich wirklich nicht. Kenne es so aus einem anderen Forum das man den Beitrag weg editiert wenn ein Thema sich erledigt hat bevor jemand antwortet

  • #2
    Da ich aus diesem grund wohl nicht mehr editieren kann:
    Der titel ist falsch
    Ich meine natürlich aus zwei Abfragen eine machen sorry

    Kommentar


    • #3
      anstatt LEFT JOIN machst du INNER JOIN

      Kommentar


      • #4
        Hallo asp2php

        Erstmal danke für deine Hilfe.
        Ich habe es so Probiert. Jedoch bewirkt dies nicht das was gewollt war
        Nun liest er mir alle aus wo in e1 einen wert haben.

        Ich probiere es mal mit etwas mehr Code zu erklären:

        PHP-Code:
        $result mysql_query("SELECT did, cid, title FROM c1");
         while (
        $row mysql_fetch_array($result)) {
          
        /* Hier haben wir noch allgemeinen code 
        der momentan nicht wichtig ist für unsere Aussage */
          
        $row1 mysql_query("SELECT did, aid, bid FROM e1 WHERE did='$row[did]'");
          if((
        $row['cid'] > $row1['aid'] || $row['cid']>$row1['bid'])) $var1="blau";
          else 
        $var1="rot";
         } 
        Nun ist es so wenn ich hier:
        PHP-Code:
        $result mysql_query("SELECT did, cid, title FROM c1"); 
        50 Resultate habe, dann macht er hier
        PHP-Code:
        $row1 mysql_query("SELECT did, aid, bid FROM e1 WHERE did='$row[did]'"); 
        50 zusätzliche DB Afragen die ich hoffentlich verhindern kann wenn ich daraus irgendwie eine Abfrage machen kann.

        Zum Problem: Nicht jeder Datensatz aus der Ersten Abfrage hat auch einen in der zweiten. Und hier ist das Problem, dass er mir mit LEFT JOIN zwar jeden datensatz ausliest, JEDOCH beachtet er mir das WHERE nicht.
        Ich habe dann dies gemacht:
        PHP-Code:
        $result mysql_query("SELECT c.did, c.cid, c.title, e.did, e.aid, e.bid 
        FROM c1 c LEFT JOIN e1 e ON (c.did=e.did) 
        WHERE c.cid>e.aid OR c.cid>e.bid"
        ); 
        Und hier ist nun das Problem, dass er mir ALLE ausgibt. Ich nehme an es liegt daran, dass nicht jeder der einträge aus c1 einträge in e1 hat.
        Nur wie kann ich dies lösen?

        Ich hoffe ich habe es diesmal geschaft das ganze etwas besser zu erklären.

        Gruss

        kari_w
        Zuletzt geändert von asp2php; 21.11.2004, 21:06.

        Kommentar


        • #5
          warum knallst du wieder 'nen Haufen von belanglosen Abfragen, die nichts mit dem zu tun, was du z.Z. hast, hierein?

          Mein Antwort bleibt immer noch so wie sie ist. Zeige was du versucht hast. Ich sehe bisher keine Änderung. Du hast zwar viel geschrieben, aber nichts gezeigt, was du mit meinem Tipp gemacht hast.

          btw: Achte bitte darauf, dass der Code nicht über alle Grenzen hinaus schießt. Am besten brichst du den Code so, wie das Eingabefeld breit ist.
          Zuletzt geändert von asp2php; 21.11.2004, 21:07.

          Kommentar


          • #6
            Hallo asp2php

            Sorry bin mir das auch nicht gewohnt. In den neuen Foren wird der Code automatisch mti scrollbalken dargestellt.

            Sorry ich habe es wohl wieder gelöscht gehabt beim schreiben.

            Also ich habe aus
            PHP-Code:
            $result mysql_query("SELECT c.did, c.cid, c.title, e.did, e.aid, e.bid 
            FROM c1 c LEFT JOIN e1 e ON (c.did=e.did) 
            WHERE c.cid>e.aid OR c.cid>e.bid"
            ); 
            dies gemacht:

            PHP-Code:
            $result mysql_query("SELECT c.did, c.cid, c.title, e.did, e.aid, e.bid 
            FROM c1 c INNER JOIN e1 e ON (c.did=e.did) 
            WHERE c.cid>e.aid OR c.cid>e.bid"
            ); 
            Nun passieren zwei Phänomene:
            1. Es werden NUR noch die Einträge angezeigt die auch einen eintrag bei e1 haben.
            2. Das WHERE wird nicht beachtet. (aber ob dies noch wo anders zusammenhängt weiss ich noch nicht glaube es aber nicht): Wenn ich das WHERE entferne, werden trotzdem nur die angezeigt die auch einen eitnrag in e1 haben.

            Gruss

            kari_w

            Kommentar


            • #7
              Original geschrieben von kari_w
              Nun passieren zwei Phänomene:
              1. Es werden NUR noch die Einträge angezeigt die auch einen eintrag bei e1 haben.
              aber das wolltest du doch, denn du hast doch geschrieben:
              Original geschrieben von kari_w
              Ist es nun möglich da trotzdem eine Abfrage zu machen, und ihm halt zu sagen das er dieses [color=red] nur ausführt wenn auch ein wert vorhanden ist?[/color]
              Original geschrieben von kari_w

              2. Das WHERE wird nicht beachtet. (aber ob dies noch wo anders zusammenhängt weiss ich noch nicht glaube es aber nicht): Wenn ich das WHERE entferne, werden trotzdem nur die angezeigt die auch einen eitnrag in e1 haben.
              soll heissen, dass die Bedingung in WHERE greifen soll, wenn KEIN Eintrag in e1 existiert oder was?

              Kommentar


              • #8
                Hmm

                sorry ich weiss das ich etwas kompliziert beschreibe. Er soll die Abfrage IMMER machen auch wenn kein wert in e1 ist. Das Problem zusätzlich ist anhal das er bei der WHERE ja trotzdem die werte von e1 benötigt bez einfach als nichts oder 0 behandeln soll das die ">" passen.

                Gibt es da eine möglichkeit zu?

                Sorry nochmals

                Gruss

                kari_w

                Kommentar


                • #9
                  komplizierte Formulierung hast du
                  bedeutet denn, dass, wenn einer der 3 Bedingungen zu trifft, soll Daten geliefert werden sollen, oder was?

                  Kommentar


                  • #10
                    Hallo asp2php

                    Ja ich weiss tut mir auch leid Habe es nicht so mit dem erklären
                    Wenn du den ganzen Code anschaust siehst du die Bedingung in der zweiten Abfrage. Jedoch wrden es dann soviele.
                    Also wenn folgendes zutrifft, dann soll er liefern:

                    c.cid>e.aid OR c.cid>e.bid
                    Und hier ist das Problem es muss auch zu treffen wenn e1 keinen eintrag hat. weil dann ist c.cid grösser als e.aid und als e.bid (da da ja kein ert existiert in e1)

                    Gruss

                    kari_w

                    Kommentar


                    • #11
                      führe deinen LEFT JOIN mal in phpmyadmin aus, was kommt da bei e.aid raus, wenn er nichts findet?
                      Ich denke, also bin ich. - Einige sind trotzdem...

                      Kommentar


                      • #12
                        Er liest mir alle ein. Und da wo es kein eintrag in e1 gibt schreibt er mir einfach NULL rein.

                        Gruss

                        kari_w

                        Kommentar


                        • #13
                          wenn du die datensätze bekommst, wo in e.aid nichts steht, dann scheint c.cid > e.aid doch zu funktionieren?
                          Ich denke, also bin ich. - Einige sind trotzdem...

                          Kommentar


                          • #14
                            Sorry ich kann nicht editieren.

                            Hate die falsche Abfrage. Er zeigt mir nichts an. Aber anhand der Fehlerhaften anzeige von vorhin nehme ich an er schaf es einfach nicht die vergleichung wenn er kein wert hat also wenn NULL drin steht. Nur die frage ist ist es denn möglich das es funktioniert?

                            gruss

                            kari_w

                            Kommentar


                            • #15
                              WHERE e.aid IS NULL OR c.cid > e.aid OR c.cid > e.bid

                              probier das mal
                              Ich denke, also bin ich. - Einige sind trotzdem...

                              Kommentar

                              Lädt...
                              X