Wie führt man eine MySQL-Abfrage durch, ohne temporäre Tabellen zu erstellen?

  • Ich habe eine Situation hier.

    Ich habe eine Abfrage:

     SELECT DISTINCT (testrecurring.id), testrecurring.cxl, testci.cd
    FROM testci, testrecurring 
    WHERE (testci.id = testrecurring.id) 
    AND testci.x_origin='1' 
    ORDER BY testrecurring.id DESC;
     

    Wenn nun keine var gesetzt ist, muss ich diese Abfrage auswählen und hier ist der Haken. Ich muss einige Id ausschließen. So mache ich es jetzt.

    Ich erstelle eine Tabelle mit dieser Abfrage: create table xxx SELECT * ..... und jetzt liegen die Ergebnisse meiner vorherigen Abfrage in einer anderen Tabelle mit dem Namen xxx.

    Dann:

     if (!isset($var)) {
        $delete = mysql_query("delete from xxx USING xxx, future_recurring where xxx.id = future_recurring.id");
    }
     

    und danach die Aufzeichnungen gelöscht Ich mache mein abschließendes select * from xxx.

    Das funktioniert gut, das einzige, was ich tun muss, ist, dass ich all diese Logik wiederholen muss, indem ich keine Tabellen erstellt. Bei einigen Joins bin ich mir nicht sicher, wie ich vorgehen soll.

    Ich hoffe, das ist nicht sehr verwirrend.

    Irgendwelche Ideen ?

    15 April 2018
    Brian Tompsett - 汤莱恩nv39
2 answers
  • Und wie wäre es damit?:

     SELECT tr.id, tr.cxl, tci.cd
    FROM testci AS tci 
    INNER JOIN testrecurring AS tr
        ON tci.id = tr.id
    LEFT OUTER JOIN future_recurring AS fr
        ON tr.id = fr.id
    WHERE tci.x_origin='1' 
        AND fr.id IS NULL
    GROUP BY tr.id, tr.cxl, tci.cd
    ORDER BY tr.id DESC
     

    Dies beinhaltet nur Ergebnisse, bei denen der Test wiederkehrt .id wird NICHT in future_recurring

    gefunden
    22 November 2011
    Nonym
  • Sie müssen lediglich eine where-Bedingung hinzufügen, um die nicht gewünschten Zeilen auszuschließen:

     SELECT * 
    FROM testci
    JOIN testrecurring on testrecurring.id = testci.id
    WHERE testci.x_origin='1' 
          AND testci.id NOT IN (SELECT id FROM future_recurring)
    ORDER BY testrecurring.id DESC;
     

    Oder Sie könnten dies versuchen, um eine bessere Leistung zu erzielen:

     SELECT * 
    FROM testci
    JOIN testrecurring on testrecurring.id = testci.id
    LEFT JOIN future_recurring on future_recurring.id = testci.id
    WHERE testci.x_origin='1' 
          AND future_recurring id IS null
    ORDER BY testrecurring.id DESC;
     

    Obwohl, wenn Ihre Indizes gut sind und vernünftig und Ihre Datensätze sind nicht enorm, dann sollte die Leistung nahe sein.

    22 November 2011
    John Watson