Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

post-64752-14430448514055_thumb.jpg

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

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

  • 2 Wochen später...
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

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.