kay899 Geschrieben 8. November 2009 Geschrieben 8. November 2009 Hallo, ich verzweifel schon seit geraumer Zeit an einem kleinen Problem: Ich würde gerne Stichworte zu einem Oberbegriff immer in einer Tabelle darstellen. Dabei kann ich die Zeilen für den Oberbegriff berechnen und entsprechend zusammenfassen. Die Stichworte stelle ich 3-Spaltig dar (wobei das austauschbar sein soll). Jetzt kommt folgendes Problem: Oberbegriff - Anzahl der Stichworte - Anzahl der Darzustellenden Zellen - Zellen die aufgefüllt werden müssten Regionen - 5 - 6 - 1 Bundesländer - 2 - 3 - 1 Veranstaltungsart - 4 - 6 - 2 (Beispielbild des Ergebnisses habe ich angehängt) Hier mein Code: $qry="SELECT t.tagid, t.tgroupid, t.label, g.label FROM pragmamx.hds_rss_tags t, pragmamx.hds_rss_taggroups g WHERE t.tgroupid = g.tgroupid ORDER BY g.sortorder ASC,t.label ASC"; //echo "$qry<p>"; $result = sql_query($qry); if($result){ $Anzahl=mysql_numrows($result); $lastgroup=0; while(list($tagid, $tgroupid, $label, $grouplabel) = sql_fetch_row($result)) { // 2. Abfrage da ich keinen JOIN kann / ID>0 heisst das die Checkbox ausgewählt werden muss $qryx="SELECT id FROM pragmamx.hds_tagging_autotags WHERE tagid='$tagid' AND rssid='$rssid'"; //echo "$qryx<p>"; $resultx = sql_query($qryx); list($Value) = sql_fetch_row($resultx); $Row++; if ($lastgroup!=$tgroupid) { $i=1; // 3. Abfrage zur Ermitteltung der Anzahl je Gruppe $qryc="SELECT count(*) FROM pragmamx.hds_rss_tags WHERE tgroupid='$tgroupid'"; //echo "$qryc<p>"; $resultc = sql_query($qryc); list($count) = sql_fetch_row($resultc); $countrow=ceil($count/$spalten); // Anzahl der Reihen ermitteln und auf Ganzzahl setzen $tabletd = $countrow * $spalten; // Anzahl der Zellen ermitteln, wenn Spalte vollständig sein soll $missingtd = $tabletd - $count; // Anzahl der "leeren" Zellen ermitteln zum auffüllen echo "$grouplabel - $count - $tabletd - $missingtd<br>"; //if ($GroupID==0) $out.="<tr bgcolor=\"$bgcolor2\"><td rowspan=\"$countrow\" valign=\"top\">$grouplabel</td>"; // Zwischenüberschrift Gruppenname $lastgroup=$tgroupid; } $out.="<td bgcolor=\"$bgcolor3\"><input type=checkbox name=\"tagbox[]\" ".(($Value>0) ? "checked " : "")."value=$tagid> $label </td>"; if($i==$spalten) { $out.="</tr><tr bgcolor=\"$bgcolor2\">"; $i=0; } $i++; } // //if ($missingtd>=1) { // for($m = 1; $m < $missingtd; $m++) // { // $out.="<td> </td>"; // } // // } } return $out;[/PHP] Ich hoffe jemand kann mir helfen den Knoten in meinem Gehirn zu lösen und mir erklären, wie ich es hinbekomme die fehlenden Zellen aufzufüllen. Vielen Dank Kay Zitieren
flashpixx Geschrieben 8. November 2009 Geschrieben 8. November 2009 ein Thema = ein Thread => http://forum.fachinformatiker.de/datenbanken/131666-anzahl-datensaetze-ermitteln-gruppe.html wie schon gesagt, mache ein Pivot aus Deinem Query, damit lässt es sich dann sehr viel kompakter lösen. Damit ist Dein Code auch verständlicher [...] $resultc = sql_query($qryc); list($count) = sql_fetch_row($resultc); $countrow=ceil($count/$spalten); // Anzahl der Reihen ermitteln und auf Ganzzahl setzen $tabletd = $countrow * $spalten; // Anzahl der Zellen ermitteln, wenn Spalte vollständig sein soll $missingtd = $tabletd - $count; // Anzahl der "leeren" Zellen ermitteln zum auffüllen echo "$grouplabel - $count - $tabletd - $missingtd<br>"; [...] [/PHP] Außerdem kann man das über den Modulo Operatir berechnen. Was ich auch schon in dem älteren Post angemerkt hatte Zitieren
kay899 Geschrieben 8. November 2009 Autor Geschrieben 8. November 2009 Hallo, im ersten Post ging es mir ja noch darum die Zeilen der Gruppierungen zusammen zu ziehen. Das klappt ja mittlerweile sehr gut. OK, das mit Modulo seh ich auch ein, auch wenn das Ergebnis bei mir auch vorhanden ist, nur wahrscheinlich halt umständlicher. Nach Pivot hab ich schon länger rumgesucht, aber nichts brauchbares gefunden, was ich verstehe. Da ich ehrlich gesagt schon Probleme bei einem einfachen JOIN habe, ist das wohl eine Nummer zu hoch, oder? Du wirst ja in meinem Code gesehen haben, dass ich mehrere Abfragen verwenden, weil ich JOINS nicht kapiere. LG Kay Zitieren
lit-web Geschrieben 18. November 2009 Geschrieben 18. November 2009 Hallo, im ersten Post ging es mir ja noch darum die Zeilen der Gruppierungen zusammen zu ziehen. Das klappt ja mittlerweile sehr gut. OK, das mit Modulo seh ich auch ein, auch wenn das Ergebnis bei mir auch vorhanden ist, nur wahrscheinlich halt umständlicher. Nach Pivot hab ich schon länger rumgesucht, aber nichts brauchbares gefunden, was ich verstehe. Da ich ehrlich gesagt schon Probleme bei einem einfachen JOIN habe, ist das wohl eine Nummer zu hoch, oder? Du wirst ja in meinem Code gesehen haben, dass ich mehrere Abfragen verwenden, weil ich JOINS nicht kapiere. LG Kay Hallo, was verstehst du denn an Joins nicht? Die sind doch relativ einfach in einer normalen DB Abfrage. Du machst damit nichts anderes als Fremdschlüssel darzustellen. Da Mysql aber Fremdschlüssel nicht bietet musst du das selber ausprogrammieren mit Joins. Einfaches Beispiel mal für dich zum reinen Verständnis. Du hast eine Tabelle User, in der stehen nun username, password, email. Und eine Tabelle Userdata, da steht drin Firstname, Lastname, Adress, Plz. So hast du erst mal Daten voneinander getrennt die im Prinzip in der Anwendung nichts miteinander zu tun haben, da steigst schon mal in die Normalisierung ein. Du kannst da auch eine Schaltertabelle noch dazwischen machen um die Beziehung beider Tabellen abzubilden, in dem Fall reicht es aber das in 2 Tabellen miteinander abzubilden. So nun gehts an die Tabellen Tabelle User Id_User int(10) auto_increment, Username varchar(100) not null, Email varchar(100) not null, primary key(Id_User), FULLTEXT(Username) Tabelle User_Data User_Id int(10) not null default '0', First_Name varchar(100) not null, Last_Name varchar(100) not null, Adress varchar(100) not null, Plz varchar(5) not null, primary key(User_Id), FULLTEXT(First_Name), FULLTEXT(Last_Name), FULLTEXT(Adress), FULLTEXT(Plz) So die Felder Id_User aus der Tabelle User und User_Id aus der Tabelle User_Data bilden nun deine Beziehung ab. Die Index Vergaben sind dazu da, wenn du mal eine Suche programmieren willst. Aber das ist dann ein anderes Thema und führt zu weit. Nun willst du alle Daten beider Tabellen ausgeben lassen, dazu musst du nun einen Join verwenden, ich verwende gern Left Join. Die Abfrage der Tabellen mit PHP Code. <?php /* * * Abfrage der beiden Tabellen * */ $sqlbefehl =" Select u.Id_User, u.Username, u.Email, ud.User_Id, ud.First_Name, ud.Last_Name, ud.Adress, ud.Plz From User u Left Join User_Data ud ON (u.Id_User = ud.User_Id) Where Id_User =".intval($_GET['Id_User'])." "; $ergebnis = mysql_query($sqlbefehl); if(!$ergebnis){ echo '<pre>'; die(mysql_error().$sqlbefehl); echo '</pre>'; } else{ $row = mysql_fetch_assoc($ergebnis); echo 'Username: '.$row['Username'].'<br />'; echo 'First_Name: '.$row['First_Name'].'<br />'; } ?> [/PHP] In dieser Abfrage wendest du einen Left Join an. Das u. und ud. bilden die Aliases. Und im ON Attribut steht die Beziehung drin anchdem die Tabellen abgefragte werden sollen. Hättest noch eine dritte tabelle in der die Beziehung zwischen beiden Tabellen abgebildet wird dann müsstest du mit 2 Joins arbeiten. Ich hoffe du hast das Prinzip was dahinter steht verstanden. Mfg lit-web Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.