jens65m: zwei abfragen vereinfachen

hi,

kurze Frage: Ist es möglich wenn ich folgende zwei Abfragen verwende:

(1)

$sql = "SELECT feld  
	FROM tabelle AS a  
	INNER JOIN tabelle2 AS b ON a.id = ...  
        [...]  
	WHERE a.xy = '$xy'";

(2)

$sql = "SELECT feld  
	FROM tabelle AS a  
	INNER JOIN tabelle2 AS b ON a.id = ...  
        [...]  
	WHERE a.xy = '$z'";

anstatt die zwei langen abfragen zusammen zu verwenden ist es doch auch bestimmt möglich den Unterschied (jeweils die letzte zeile) auf die Ausgabe zu beziehen?!

Ungefähr so:

(einzige Abfrage)

$sql = "SELECT feld  
	FROM tabelle AS a  
	INNER JOIN tabelle2 AS b ON a.id = ...  
        [...]";

(später)

$result = mysql_query($sql, $connection) or die(mysql_error());  
$row = mysql_fetch_assoc($result);
echo $row //(WHERE a.xy = '$z')  
echo $row //(WHERE a.xy = '$xy')

Hab nur leider kein Plan wie ich das richtig formulieren könnte,
bzw. ob das überhaupt möglich ist.

  1. Hi,

    Hab nur leider kein Plan wie ich das richtig formulieren könnte,

    Und ich kann - wieder mal - nur raten, was du gemeint haben könntest.

    $sql = "SELECT feld

    FROM tabelle AS a
    INNER JOIN tabelle2 AS b ON a.id = ...
            [...]
    WHERE a.xy = '$xy'";

    
    >   
    > (2)  
    > ~~~php
    
    $sql = "SELECT feld  
    
    > 	FROM tabelle AS a  
    > 	INNER JOIN tabelle2 AS b ON a.id = ...  
    >         [...]  
    > 	WHERE a.xy = '$z'";
    
    

    anstatt die zwei langen abfragen zusammen zu verwenden ist es doch auch bestimmt möglich den Unterschied (jeweils die letzte zeile) auf die Ausgabe zu beziehen?!

    Diese Formulierung ergibt für mich wenig Sinn.

    (einzige Abfrage)

    $sql = "SELECT feld

    FROM tabelle AS a
    INNER JOIN tabelle2 AS b ON a.id = ...
            [...]";

      
    In dieser könntest du zumindest schon mal die beiden einzelnen WHERE-Bedingungen durch Oder verknüpft unterbringen.  
      
    Damit bekommst du aber immer noch die Datensätze jeweils einzeln.  
      
    
    > (später)  
    > ~~~php
    
    $result = mysql_query($sql, $connection) or die(mysql_error());  
    
    > $row = mysql_fetch_assoc($result);
    
    

    echo $row //(WHERE a.xy = '$z')

    echo $row //(WHERE a.xy = '$xy')

      
    Nein, die einzelnen Datensätze müsstest du damit schon noch einzeln auswerten. Du kannst natürlich vorher schon nach dem Inhalt der Spalte xy sortieren, wenn du dir diese Auswertung dann einfacher machen willst - Gruppenwechsel wäre hier ein Stichwort.  
      
    Wenn das nicht das ist, was du erreichen willst - dann beschreibe das bitte noch mal genauer und verständlicher, und erkläre uns vor allem auch dein Datenmodell.  
      
    MfG ChrisB  
      
    
    -- 
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    
    1. nene,
      ich mein ich habe einfach nur dass sich die zwei Abfragen fast gleichen bis auf die beiden WHERE Parameter.

      Das ganze geht zurzeit ungefähr so:

        
      $sql = "SELECT feld  
      	FROM tab1 AS a  
      	INNER JOIN tab2 AS b ON a.id = b.xid  
      	INNER JOIN tab3 AS c ON b.yid = c.xid  
      	WHERE c.z = '$var'";  
              AND c.bla = 'wert1'  
      $result = mysql_query($sql, $connection) or die(mysql_error());  
      $row = mysql_fetch_assoc($result);  
        
      //Ausgabe der Abfrage (1)  
        
      $sql = "SELECT feld  
      	FROM tab1 AS a  
      	INNER JOIN tab2 AS b ON a.id = b.xid  
      	INNER JOIN tab3 AS c ON b.yid = c.xid  
      	WHERE c.z = '$var'";  
              AND c.bla = 'wert2'  
      $result = mysql_query($sql, $connection) or die(mysql_error());  
      $row = mysql_fetch_assoc($result);  
        
      //Ausgabe der Abfrage (2)  
        
      
      

      und ich möchte es kürzen auf

      $sql = "SELECT feld
      FROM tab1 AS a
      INNER JOIN tab2 AS b ON a.id = b.xid
      INNER JOIN tab3 AS c ON b.yid = c.xid
      WHERE c.z = '$var'";
      $result = mysql_query($sql, $connection) or die(mysql_error());
      $row = mysql_fetch_assoc($result);

      //Ausgabe aller $row["feld"] Werte aber nur die deren c.bla = 'wert1' ist.

      $result = mysql_query($sql, $connection) or die(mysql_error());
      $row = mysql_fetch_assoc($result);

      //Ausgabe aller $row["feld"] Werte aber nur die deren c.bla = 'wert2' ist.

      Lg

      1. Hi,

        ich mein ich habe einfach nur dass sich die zwei Abfragen fast gleichen bis auf die beiden WHERE Parameter.

        Nun, dann kannst du bspw. so vorgehen, wie ich es bereits vorgeschlagen habe.

        MfG ChrisB

        --
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
        1. ok und wenn ich die zwei Abfragen jetzt so zusammen lege...

            
          $sql = "[code lang=sql]SELECT feld  
                  FROM tab1 AS a  
                  INNER JOIN tab2 AS b ON a.id = b.xid  
                  INNER JOIN tab3 AS c ON b.yid = c.xid  
                  WHERE c.z = '$var'  
                  AND c.bla = 'wert2'  
                  OR c.bla = 'wert1'
          ~~~";  
          $result = mysql\_query($sql, $connection) or die(mysql\_error());  
          $row = mysql\_fetch\_assoc($result);  
          [/code]  
            
          ...weiß ich immernoch nicht, wie ich die Daten aus $row dann aufteile in die Datensätze, die "wert1" und die Datensätze die "wert2" entsprechen.  
            
          LG
          
          1. Hi,

            ok und wenn ich die zwei Abfragen jetzt so zusammen lege... [...]
            ...weiß ich immernoch nicht, wie ich die Daten aus $row dann aufteile in die Datensätze, die "wert1" und die Datensätze die "wert2" entsprechen.

            Auch dazu nannte ich dir bereits ein Stichwort.

            MfG ChrisB

            --
            RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
          2. Hi!

            ok und wenn ich die zwei Abfragen jetzt so zusammen lege...
            ...weiß ich immernoch nicht, wie ich die Daten aus $row dann aufteile in die Datensätze, die "wert1" und die Datensätze die "wert2" entsprechen.

            Wenn du grüne und rote Bohnen zusammenschüttest, wie kannst du sie dann wieder separieren? Nun die Bohnen mit der grünen Farbe legst du nach links, die mit der roten Farbe nach rechts. Beim Programmieren ist das auch nicht anders. Die Frage ist nur, warum du dir diese Mühe machst. Du versuchst etwas einzusparen und hast dann hinterher Mehraufwand. Es kommt dann auch nicht mehr darauf an, ob die Bohnen nach Farben sortiert ankommen, du musst mindestens die Bohnen der ersten Farbe Stück für Stück überprüfen, ob die Farbe noch die selbe ist. Sich für den Rest der Bohnen das Farbenprüfen sparen zu wollen, macht das Kraut auch nicht mehr fett, denn es bleibt, dass jede Bohne einzeln in Empfang genommen werden muss (Fetch-Vorgang). Diese Vorgehensweise scheint vielleicht dann sinnvoll, wenn das Joinen der Tabellen einen großen Aufwand verursacht, den man sich bei der zweiten Abfrage sparen will. Dann sollte man mal schauen, ob man dem DBMS mit Indexen oder einer Einschränkung der Datenmenge (Subquery statt vollständiger Tabelle) das Leben einfacher machen kann. - Wie immer heißt es, vorher messen, nachher messen, schauen ob es was gebracht hat.

            Lo!