tobi85: MySQL SELECT Zeile duplizieren

Hallo Zusammen,

ich habe ein Problem mit einer SQL-Abfrage und zwar möchte ich eine Zeile verdoppeln, wenn eine Bedingung erfüllt ist. Im Beispiel - wenn der Artikel in Tabelle artikel_sopo gefunden wird.

Meine Abfrage ist aktuell wie folgt (gekürzte)

SELECT SQL_CALC_FOUND_ROWS artikel.anr, artikel.produkt, artikel_sopo.value, IF(artikel_sopo.value,CONCAT(artikel.anr,'-SOPO'), artikel.anr) as sopo
FROM artikel
LEFT JOIN artikel_sopo ON artikel_sopo.anr=artikel.anr
GROUP BY sopo
LIMIT 9

Natürlich könnte ich auch mit PHP später die Zeile duplizieren, wenn in Spalte artikel_sopo.value etwas steht, allerdings passt dann meine Ausgabe mit SQL_CALC_FOUND_ROWS nicht und diese Gesamtzahl benötige ich, um nachher die Gesamt-Seitenzahl zu berechnen.

  1. Tach!

    ich habe ein Problem mit einer SQL-Abfrage und zwar möchte ich eine Zeile verdoppeln, wenn eine Bedingung erfüllt ist.

    Da hätte ich jetzt "INSERT ... SELECT ..." gesagt. Kann aber sein, dass das nicht auf ein und derselben Tabelle geht.

    allerdings passt dann meine Ausgabe mit SQL_CALC_FOUND_ROWS nicht und diese Gesamtzahl benötige ich, um nachher die Gesamt-Seitenzahl zu berechnen.

    Da musst du mal schauen, ob das damit zusammenspielt. Aber vermutlich eher nicht. Welche Zahl soll denn SQL_CALC_FOUND_ROWS liefern? Die Anzahl vor dem Einfügen oder die von danach? (Im Zweifelsfall die Zahl von davor mal zwei nehmen.)

    dedlfix.

    1. Hallo,

      zum einfachen Verständnis, kleines Beispiel.

      Wir haben 200 Artikel in der DB. Nun möchte ich bei der Abfrage herausfinden, wie viele Datensätze INSGESAMT gefunden wurden und das bekomme ich nur hin mit SQL_CALC_FOUND_ROWS, da ja bei mysql_num_rows nur "9" ausgegeben wird, da ja die Abfrage mit LIMIT 9 limitiert wird.

      Nun habe ich bei den 200 Artikel insgesamt 20 Artikel mit einen SOPO-Eintrag, was nun also als Gesamt-Zahl 220 Artikel bedeuten würde. Bei meiner aktuellen Abfrage würde das Skript aber trotzdem nur 200 Zeilen finden, da eben diese SOPO-Eintrage nicht "doppelt" gezählt wird.

      1. Tach!

        Wir haben 200 Artikel in der DB. Nun möchte ich bei der Abfrage herausfinden, wie viele Datensätze INSGESAMT gefunden wurden und das bekomme ich nur hin mit SQL_CALC_FOUND_ROWS, da ja bei mysql_num_rows nur "9" ausgegeben wird, da ja die Abfrage mit LIMIT 9 limitiert wird.

        Nun habe ich bei den 200 Artikel insgesamt 20 Artikel mit einen SOPO-Eintrag, was nun also als Gesamt-Zahl 220 Artikel bedeuten würde. Bei meiner aktuellen Abfrage würde das Skript aber trotzdem nur 200 Zeilen finden, da eben diese SOPO-Eintrage nicht "doppelt" gezählt wird.

        Achso, du möchtest überhaupt gar keine Zeile duplizieren, sondern nur doppelt zählen. Nun, SQL_CALC_FOUND_ROWS wird dir da nicht weiterhelfen. Und ich wüsste jetzt auch nicht, wie man das in einer Abfrage hinbekommt, die mit LIMIT ausgestattet ist. - Doch, mir fällt da was ein, aber hübsch ist das nicht. Ergänze in der Feldliste eine weitere Spalte, in der per Subquery die entsprechenden Datensätze gezählt werden. Dann hast du das Ergebnis aber in jedem Datensatz der Ergebnismenge stehen.

        Jedenfalls würde ich (egal ob separat oder mit der Subquery) mit SUM(IF(SOPO, 2, 1)) arbeiten.

        dedlfix.

        1. Hallo und danke, allerdings habe ich dann ein Problem mit der Performance, denn bei mehr als 50.000 Artikel, diese nicht mit LIMIT einzugrenzen...

          Des Weiteren möchte ich ja mit LIMIT 9 bewirken, dass auf jeder Seite 9 Datensätze/Artikel angezeigt werden. Wenn ich nun durch den SOPO-Artikel diesen bei der PHP-Ausgabe dupliziere, habe ich zum Beispiel auf einmal 10 Artikel auf einer Seite.

          1. Tach!

            Hallo und danke, allerdings habe ich dann ein Problem mit der Performance, denn bei mehr als 50.000 Artikel, diese nicht mit LIMIT einzugrenzen...

            Glaub ich nicht. Die zählende Query liefert exakt ein Ergebnis und nicht 50000.

            Wenn ich nun durch den SOPO-Artikel diesen bei der PHP-Ausgabe dupliziere, habe ich zum Beispiel auf einmal 10 Artikel auf einer Seite.

            Du willst doch gar keine Duplizierung haben, sondern nur eine bei SOPO um 1 erhöhte Zählung.

            dedlfix.

            1. Hallo,

              also mein Ergebnis sollte sein, dass der eine Artikel zweimal ausgegeben wird, wenn in in der Tabelle sopo der Artikel existiert. In dem Fall ist es zwar der selbe Artikel, aber er sollte eben zwei mal dargestellt werden und somit sollten es dann auch zwei Zeilen sein.

              1. Tach!

                also mein Ergebnis sollte sein, dass der eine Artikel zweimal ausgegeben wird, wenn in in der Tabelle sopo der Artikel existiert.

                OK, er soll also doch, aber nur für die Ergebnismenge dupliziert werden. Das geht nicht direkt, das geht nur über Umwege. Einer wäre, beide Abfragen (die originalen und die SOPO-Datensätze) mit UNION zu verknüpfen. Daran kann man auf alle Fälle ein LIMIT hängen. Da wird aber vermutlich kein SQL_CALC_FOUND_ROWS einzubauen gehen. Aber man kann die UNION-Querys auch als Subquery formulieren, und dann sollte es gehen.

                dedlfix.