• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Query sortiert nicht richtig (zwei Tabellen)

aJunkie

Mitglied
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:
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
 
Ja, allerdings. Ich habe gerade beschlossen, dass ich keine Lust habe, zu versuchen, die Beschreibung nachzuvollziehen.

1. Was hast du? (Schema, Beispieldaten)
2. Was willst du haben? (Ergebnismenge)
 
Ops. :) Nochmal...

Vorhanden:
1.png
Hier werden alle freigegeben Bücher ausgegeben... Im Select sind die jeweiligen Units zu sehen. Im Beispiel 6.

Was ich nun gerne hätte, ist eine kleine Abfrage, ob in der Datenbank zu der Unit 3 beispielsweise überhaupt Datensätze gespeichert sind und erst dann <option value="3"> ausgeben. Wenn nicht, soll eben die nächste Unit gecheckt werden.

Die Codes zu dem Beispiel da oben:
PHP:
        $q = mysql_query('SELECT books.id, books.book_name, books.units, COUNT(voc.id) as counted_vocs FROM `'.PREFIX.'_books` as books, `'.PREFIX.'_vokabeln` as voc 
                        WHERE books.frei = 1 AND books.id = voc.book GROUP BY voc.book');

        // BÜCHER VORHANDEN
        if(mysql_num_rows($q) > 0):

            // ...

                $i = 0;
                
                while($row = mysql_fetch_object($q)):
    
                   // echo's
                        
                        echo '<b>'.$row->book_name.'</b><br />'."\n";
                        echo $row->units.' Units | ' . $row->counted_vocs . ' Vokabeln<br />'."\n";
                                
                            echo '<select name="unit" onchange="this.form.submit();">'."\n";
                                echo '<option value="">Wähle eine Unit aus</option>'."\n";
                                echo '<option value="all_units">Alle Units gemixt</option>'."\n";
                            
                                for($ii = 1; $ii <= $row->units; $ii++):
                                    echo '<option value="'.$ii.'">Unit '.$ii.'</option>'."\n";
                                endfor;
                                    
                            // ... echo's
                    
                    $i++;
                endwhile;

Struktur:
2.jpg
Die Schlüsselbeziehung: books.id <> vokabeln.book
Im Feld books.units ist eben ein Integer gespeichert, wie viele Units das Buch MAXIMAL besitzt.
In "vokabeln" werden die Vokabeln gespeichert und die Unit im dementsprechend Feld. vokabeln.unit ist kleiner gleich groß books.units

Meine Schleife da oben gibt eben so viele <option> aus, wie books.units groß ist. Aber es soll nun auch vokabeln.unit abgefragt werden, ob die gerade ausgegebe <option value="UnitInt"> entspricht. Wenn ja, heißt es, dass es in "vokabeln" dementsprechend Datensätze gibt und nicht umsonst ausgegeben wird.

Mein Versuch war eben, das Feld vokabeln.unit zu selektieren und in der Schleife zu fragen, ob der $ii Key genau so groß ist, wie die gerade selektierte Unit. Wenn Ja, ausgeben, wenn nein, keine Datensätze zu dieser Unit gefunden.
Entweder es wird nur das erste Vorkommen ausgegeben oder sobald ich GROUP BY manipuliere, dann werden auch nur die vorhandenen Units ausgegeben, aber nicht zu einem Buch zusammengefasst.
Siehe hier:
3.jpg

Jetzt werden so viele Bücher ausgegeben. Network 2 offensichtlich drei mal, weil es einige Datensätze gibt, die zu drei unterschiedlichen Units (vokabeln.unit) abgehören.

Ich hoffe, dass das verständlich war.
Ich möchte die Ausgabe im letzten Bild so haben, dass diese drei Units zu einem Buch gehören und das selbe Buch nicht so oft geteilt wird, wie es Units gibt.
 
Zuletzt bearbeitet:
Zurück
Oben