Seite 1 von 2
Datenbank Ergebnisse gefiltert anzeigen
Verfasst: 08.01.2010 23:40
von Helmut
Hallo,
ich habe ein kleines Problem und komme nicht weiter. Zur Anzeige einer Liste hole ich mir die Daten aus einer Tabelle und möchte sie nach 'hersteller' sortiert anzeigen lassen. Das funktioniert auch soweit, aber ich möchte jetzt die doppelten Einträge von Hersteller nicht anzeigen lassen. Jetzt sieht es so aus:
- Hartmann
Produkt_x, Art.Nr. 123456, 13,95 €
Hartmann
Produkt_y, Art.Nr. 120000, 9,95 €
Hartmann
Produkt_z, Art.Nr. 123006, 14,65 €
Braun
Produkt_x, Art.Nr. 987000, 16,25 €
Braun
Produkt_y, Art.Nr. 569900, 12,60 €
Braun
Produkt_z, Art.Nr. 223005, 11,75 €
Braun
Produkt_a, Art.Nr. 116699, 15,95 €
SCA
Produkt_x, Art.Nr. 100200, 10,25 €
SCA
Produkt_y, Art.Nr. 100300, 13,50 €
Ich möchte es aber so haben:
- Hartmann
Produkt_x, Art.Nr. 123456, 13,95 €
Produkt_y, Art.Nr. 120000, 9,95 €
Produkt_z, Art.Nr. 123006, 14,65 €
Braun
Produkt_x, Art.Nr. 987000, 16,25 €
Produkt_y, Art.Nr. 569900, 12,60 €
Produkt_z, Art.Nr. 223005, 11,75 €
Produkt_a, Art.Nr. 116699, 15,95 €
SCA
Produkt_x, Art.Nr. 100200, 10,25 €
Produkt_y, Art.Nr. 100300, 13,50 €
Es soll also bei mehreren Einträgen in der Spalte 'hersteller' nur beim ersten Durchlauf der while Schleife der Name mit ausgegeben werden, bei den weiteren Durchläufen nicht, wenn er gleich ist.
Aktueller Code:
Code: Alles auswählen
$sql = "SELECT data_id, hersteller, produkt, art_nr, preis
FROM ". HERSTELLER_TABLE .'
ORDER BY hersteller ASC';
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
$data_id = $row['data_id'];
$hersteller = $row['hersteller'];
$produkt = $row['produkt'];
$art_nr = $row['art_nr'];
$preis = $row['preis'];
}
$template->assign_vars(array(
'DATA_ID' => $data_id,
'HERSTELLER' => $hersteller,
'PRODUKT' => $produkt,
'ART_NR' => $art_nr,
'PREIS' => $preis,
));
$db->sql_freeresult($result);
Ich kann mich erinnern dass schon einmal hier so eine ähnliche Frage war, ist bestimmt schon ein oder zwei Jahre her. Leider konnte ich den Beitrag nicht finden und weis daher auch nicht, ob da eine Lösung dabei war, die für mich auch passt.
Kann mir jemand sagen wie ich den Code, vermutlich in der while Schleife anpassen muss, damit die Anzeige so aussieht, wie ich es haben möchte?
Gruß Helmut
Re: Datenbank Ergebnisse gefiltert anzeigen
Verfasst: 09.01.2010 01:23
von 4seven
array_unique ist das zauberwort
http://php.net/manual/de/function.array-unique.php
die anfrage war, glaub ich, damals von mir. musste dringend datei-dopplungen vermeiden und habe mir diesbezüglich den kopf zermartert. letztlich brachte diese kombination die Lösung, wegen unterschiedlicher ausgaben bei gleichen dateinamen unter var_dump().
Code: Alles auswählen
array_unique($var);
array_map('trim', $var);
sort($var);
testen
oder auch
Code: Alles auswählen
array_unique($var['rowkey']);
array_map('trim', $var['rowkey']);
sort($var['rowkey']);
testen
bei dir sollte aber schon ein
reichen
ggf. die variablen als array trimmen > via foreach und
geht auch innerhalb von
und dann weiterverarbeiten
gruß
4seven
Re: Datenbank Ergebnisse gefiltert anzeigen
Verfasst: 09.01.2010 13:38
von Pyramide
Das hilft hier aber nicht weiter, da sich die Datensätze ja unterscheiden (und selbst wenn das nicht der Fall wäre, wäre ein SELECT DISTINCT auf Datenbankebene sinnvoller).
Entweder du teilst deine Abfrage auf und holst zuerst die Liste der Hersteller und dann zu jedem Hersteller die Produkte. Alternativ lässt du bei der Ausgabe eine Hilfsvariable mitlaufen und gibst den Hersteller nur aus, wenn dieser ungleich dem vorigen ist.
Re: Datenbank Ergebnisse gefiltert anzeigen
Verfasst: 09.01.2010 14:27
von Helmut
Hallo 4svenen, Pyramide,
also mir array_uniqe() funktioniert es überhaupt nicht, kann ja auch nicht gehen da ich pro Schleifendurchlauf ja nur jeweils den nächsten Wert bekomme.
Ich habe es jetzt mit foreach() gemacht, das funktioniert auch soweit ganz gut, nur ein kleines Problem gibt es da noch.
Code: Alles auswählen
$vorherigesElement = '';
$letztesMultiple = '';
$sql = "SELECT data_id, hersteller, produkt, art_nr, preis
FROM ". HERSTELLER_TABLE .'
ORDER BY hersteller ASC';
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
$test = '#';
$var[] = $row['hersteller'];
foreach($var as $aktuelles)
{
if ($vorherigesElement == $aktuelles)
{
if ($aktuelles != $letztesMultiple)
{
$letztesMultiple = $aktuelles;
$var = '';
$test = $aktuelles;
}
}
$vorherigesElement = $aktuelles;
}
$row['hersteller'] = $test;
$data_id = $row['data_id'];
$hersteller = $row['hersteller'];
$produkt = $row['produkt'];
$art_nr = $row['art_nr'];
$preis = $row['preis'];
}
Die Ausgabe von 'hersteller' beginnt nicht beim ersten Datensatz sondern ist genau um einen Datensatz verschoben. Am Angfang wird da anscheinend ein leerer Wert eingefügt, was dann zur Folge hat, dass der Herstellername dann bei den folgenden Ergebnissen auch um eins nach vorne gerückt ist. Zur Kontrolle habe ich da ein # eingefügt damit ich es sehen konnte.
Die Liste sieht jetzt so aus:
- #
Produkt_x, Art.Nr. 123456, 13,95 €
Hartmann
Produkt_y, Art.Nr. 120000, 9,95 €
#
Produkt_z, Art.Nr. 123006, 14,65 €
#
Produkt_x, Art.Nr. 987000, 16,25 €
Braun
Produkt_y, Art.Nr. 569900, 12,60 €
#
Produkt_z, Art.Nr. 223005, 11,75 €
#
Produkt_a, Art.Nr. 116699, 15,95 €
#
Produkt_x, Art.Nr. 100200, 10,25 €
SCA
Produkt_y, Art.Nr. 100300, 13,50 €
Also da muss noch irgendwo ein Denkfehler in der foreach() Verarbeitung sein, finde ihn aber nicht!?
Gruß Helmut
Re: Datenbank Ergebnisse gefiltert anzeigen
Verfasst: 09.01.2010 15:32
von 4seven
und selbst wenn das nicht der Fall wäre, wäre ein SELECT DISTINCT auf Datenbankebene sinnvoller
jup, da war ein denkfehler..
Re: Datenbank Ergebnisse gefiltert anzeigen
Verfasst: 09.01.2010 21:28
von Pyramide
Mir wird nicht ganz klar, warum du da mit insgesamt vier Hilfsvariablen (davon ein Array) arbeitest. Im Prinzip funktioniert das ganze so:
Code: Alles auswählen
$letzter_hersteller = false;
foreach($data as $row) {
if($row['hersteller'] !== $letzter_hersteller) {
print "<h1>Hersteller: $row[hersteller]</h1>";
$letzter_hersteller = $row['hersteller'];
}
print "Produkt: $row[produkt]<br>Preis:$row[preis]";
}
Re: Datenbank Ergebnisse gefiltert anzeigen
Verfasst: 10.01.2010 00:35
von Helmut
Hallo Pyramide,
ich habe mal dein Vorschlag getestet, der geht nur teilweise. Die Schleife wird dabei nur sooft durchlaufen bis sich der Hersteller wechselt.
Meine Version funktioniert schon, ich habe den Fehler gefunden, es war nur ein Tippfehler. Die Zeile
muss eigentlich so lauten:
Bei deiner Version bin ich aber noch nicht dahinter gekommen, warum er nur einmal die Herstellernamen raus nimmt und bei den folgenden dann nicht mehr.
Gruß Helmut
Re: Datenbank Ergebnisse gefiltert anzeigen
Verfasst: 10.01.2010 03:23
von Pyramide
Helmut hat geschrieben:ich habe mal dein Vorschlag getestet, der geht nur teilweise. Die Schleife wird dabei nur sooft durchlaufen bis sich der Hersteller wechselt.
Das kann definitiv nicht sein, da die Schleife ja nirgends abgebrochen wird, sondern mit der if-Bedingung ausschließlich die Anzeige der Hersteller-Überschrift gesteuert wird.
Re: Datenbank Ergebnisse gefiltert anzeigen
Verfasst: 10.01.2010 20:34
von Helmut
Hallo Pyramide,
ok, es geht schon, hatte da einen kleinen Fehler drinnen.
Ich habe es aber trotzdem anders gemacht und zwar so:
Code: Alles auswählen
$letzter_hersteller = false;
$list = array();
$sql = "SELECT data_id, hersteller, produkt, art_nr, preis
FROM ". HERSTELLER_TABLE .'
ORDER BY hersteller ASC';
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
for( $i = 0; $i < count($i); $i++ )
{
$list[$i] = $row['data_id'];
$data_id = $row['data_id'];
if($row['hersteller'] !== $letzter_hersteller)
{
$hersteller = $row['hersteller'];
$letzter_hersteller = $row['hersteller'];
}
else
{
$hersteller = '';
$letzter_hersteller = $row['hersteller'];
}
$produkt = $row['produkt'];
$art_nr = $row['art_nr'];
$preis = $row['preis'];
}
$template->assign_block_vars('test', array(
'DATA_ID' => $data_id,
'HERSTELLER' => $hersteller,
'PRODUKT' => $produkt,
'ART_NR' => $art_nr,
'PREIS' => $preis,
));
}
$db->sql_freeresult($result);
Trotzdem Danke für deine Unterstützung.
Gruß Helmut
Re: Datenbank Ergebnisse gefiltert anzeigen
Verfasst: 10.01.2010 23:52
von Pyramide
In deinem Code sind ja schon wieder haufenweise unnötige Variablen drin. Die for-Schleife ist komplett sinnlos, da count(integer) immer 1 zurückgibt und die Schleife somit nur einmal durchläuft. Und das $list Array (mit einem Element, das immer überschrieben wird) wird auch nirgends ausgelesen.
Naja, wenn du Spaß dran hast, dann programmier das so. Ich empfehle dir dann, noch diesen Code einzufügen:
Code: Alles auswählen
$bester_hersteller = time();
if($bester_hersteller % 21 == 17) {
$guenstigstes_produkt = false;
}
else {
for($j = 0; $j<$bester_hersteller; $j += 47110815) {
$guenstigstes_produkt++;
}
}