Halli Hallo, Ich selektiere Bücher, die freigegeben sein müssen und zähle alle Einträge in einer anderen Tabelle über einen Fremdschlüssel. Das Ganze möchte ich optimieren.
Zurerst einmal der Query:
Und das würde ich gerne verhindern. books.units ist eine feste Zahl. In der anderen Tabelle, also voc.unit sind die Vokabeln gespeichert mit jeweils einer Zahl in voc.unit (die kleiner ist als books.units).
Es sollen in der for-Schleife aber nicht alle Units kleiner als books.units ausgegeben werden, sondern per MySQL auch alle Datensätze geholt werden, um später diese PHP Abfrage zu machen.
Da werden dann nur noch die ersten Treffer ausgegeben. Wenn ich den Group by-Teil ändere, werden tatsächlich alle Units ausgegeben, die Vokabeln enthalten, aber die Bücher dann so oft fach wie Units vorhanden. Beispiel, wie es aussehen sollte: Buch 1: Unit 1 Unit 4 Buch 2: Unit 3 Unit 4 Unit 7 Aber mit meinem Versuch da oben passiert nur folgendes: Buch 1: Unit 1 Buch 1: Unit 4
Zurerst einmal der Query:
PHP:
$q = mysql_query('SELECT books.id, books.book_name, books.units, COUNT(voc.id) as counted_vocs FROM `e_books` as books, `e_vokabeln` as voc WHERE frei = 1 AND books.id = voc.book GROUP BY books.id'); // ... books.units ist eine Dezimalzahl
for($ii = 1; $ii units; $ii++):
echo 'Unit '.$ii.''."\n";
endfor; // hier werden dann nun so viele Units ausgegeben, wie die Zahl in books.units groß ist.
Und das würde ich gerne verhindern. books.units ist eine feste Zahl. In der anderen Tabelle, also voc.unit sind die Vokabeln gespeichert mit jeweils einer Zahl in voc.unit (die kleiner ist als books.units).
Es sollen in der for-Schleife aber nicht alle Units kleiner als books.units ausgegeben werden, sondern per MySQL auch alle Datensätze geholt werden, um später diese PHP Abfrage zu machen.
PHP:
$q = mysql_query('SELECT books.id, books.book_name, books.units, voc.unit, COUNT(voc.id) as counted_vocs FROM `e_books` as books, `e_vokabeln` as voc WHERE frei = 1 AND books.id = voc.book GROUP BY books.id');
for($ii = 1; $ii units; $ii++):
/* voc.unit ist eine Zahl. Beispiel: Im ersten Durchlauf ist es eine 3. Also gibt es Vokabeln, die für Unit 3 gedacht sind. Wenn ja, ausgeben, wenn nein, das da unten nicht ausgeben, sodass am Ende nur Units ausgegeben werden, wenn es irgendwelche Vokabeln dazu gibt. */
if($row->unit == $ii) echo 'Unit '.$ii.''."\n";
endfor;
Da werden dann nur noch die ersten Treffer ausgegeben. Wenn ich den Group by-Teil ändere, werden tatsächlich alle Units ausgegeben, die Vokabeln enthalten, aber die Bücher dann so oft fach wie Units vorhanden. Beispiel, wie es aussehen sollte: Buch 1: Unit 1 Unit 4 Buch 2: Unit 3 Unit 4 Unit 7 Aber mit meinem Versuch da oben passiert nur folgendes: Buch 1: Unit 1 Buch 1: Unit 4