Zur Navigation

Schleife auslesen

1 Frank

Hi Jörg,

mit dieser Schleife erhalte ich alle Namen angezeigt und sollte die Anzahl mehr als 1 sein diesen Eintrag rot markiert.

$abfrage_kunden1 = mysql_query("SELECT DISTINCT ID, Name FROM Kunden ORDER BY ID ASC");
while($row_kunden1 = mysql_fetch_array($abfrage_kunden1))
{
    $kundenid = $row_kunden1['ID'];
    $kunden_name = $row_kunden1['Name'];

    	$resultGesamt = @mysql_query("SELECT COUNT(*) AS menge FROM Bestand WHERE
    	(status = 'neu') AND (kunde = '$kundenid') ORDER BY kunde ASC");

    	$Anzahl = @mysql_result($resultGesamt,0,"menge");

         if ($Anzahl >= '1')
    	{
    	$kunden_anzeige.= "<option class=\"red\" value=\"$kundenid\">$kunden_name</option>";
    	}
    	else
    	{
    	$kunden_anzeige.= "<option class=\"norm\" value=\"$kundenid\">$kunden_name</option>";
    	}
}

Nun möchte ich jedoch alle rot markierten (also mehr als 1) zuerst angezeigt bekommen und dann alle ohne Eintrag. Wie muss ich die Abfrage ändern?

03.12.2007 08:19

2 Jörg Kruse

Hallo Frank,

die Abfrage musst du nicht ändern, du kannst einfach das if Konstrukt "umdrehen"?

if ($Anzahl < 1)
    {
    $kunden_anzeige.= "<option class=\"norm\" value=\"$kundenid\">$kunden_name</option>";
    }
    else
    {
    $kunden_anzeige.= "<option class=\"red\" value=\"$kundenid\">$kunden_name</option>";
    }

PS: Ich würde es vermeiden, Queries in Schleifen zu packen, und in diesem Fall versuchen, $Anzahl schon in der ersten Query außerhalb der Schleife aus der Datenbank zu holen, indem du dort mit GROUP BY arbeitest.

03.12.2007 10:26

3 Frank

Kannst du mir mal Code dafür zeigen? Mit deiner Variante erhalte ich das gleiche Ergebnis. Es wird mir ein Eintrag rot markiert angezeigt, dann zwei nicht dann der nächste wieder rot ...

Ich möchte aber, dass alle roten oben angezeigt werden und die restlichen unmarkierten darunter.

Kannst du meinen Code entsprechend anpassen?

Gruß Frank

03.12.2007 11:30

4 Jörg Kruse

Sorry, dann hatte ich doch wohl falsch verstanden. Wenn du zuerst nach status sortieren möchtest, dann kannst du das über eine JOIN Abfrage über die Tabellen Kunden und Bestand, probier das mal in etwa so:

SELECT DISTINCT Kunden.ID, Kunden.Name, Bestand.status FROM Kunden JOIN Bestand ON Kunden.ID = Bestand.kunde ORDER BY Bestand.status, Kunden.ID ASC

gegebenenfalls noch ein ASC oder DESC hinter status setzen

Und wenn du status hier gleich mit abfragst, benötigst du auch keine Queries mehr in der Schleife. Du unterscheidest dort dann einfach danach, ob "status == 'neu'"

03.12.2007 11:53

5 Frank

Sorry, aber das ist immer noch nicht das was ich wollte. Meine Abfrage war schon "fast" richtig. Jeder Kunde wird in einer Schleife durchlaufen. Es wird geschaut ob es einen Eintrag gibt. (dann ist der Inhalt 1 oder mehr) somit soll die Zeile rot markiert werden. Funktioniert! Nun wird die Schleife bei jedem Kunden wieder durchlaufen und sollte es wieder irgendwo einen Eintrag geben dann wird wieder die entsprechende Zeile rot markiert. Ich erhalte so halt eine Liste mit rot gekennzeichneten Zeilen und einige Ohne, da die Schleife ja jeden Kunden explizit überprüft.

Meine Frage, ich möchte jedoch nach dem durchlaufen alle "roten Zeilen" zuerst angezeigt bekommen und darunter dann die restlichen Kunden ohne Markierung. Wie setzt man das um?

Gruß Frank

03.12.2007 12:08

6 Jörg Kruse

Sorry, aber das ist immer noch nicht das was ich wollte.

Was ist denn das Ergebnis?

Ich kenne die Datenbankstruktur ja nicht, vielleicht postest du mal die Struktur von Kunden und Bestand, denn bei JOIN Abfragen kann man ja auch Fehler einbauen, oder ich habe ein falsches weil unvollständiges Verständnis der Datenbank-Struktur

Meine Abfrage war schon "fast" richtig

Deine Abfrage ist insofern problematisch, als sie in einer Schleife abläuft. Bei 100 Kunden laufen 100 Datenbankabfragen, bei 1000 Kunden 1000 Queries. Deswegen mein Vorschlag einer einzelnen JOIN Abfrage

Es wird geschaut ob es einen Eintrag gibt.
... wenn: "status = 'neu'". Andernfalls "status != 'neu'" - eine Sortierung nach Status sollte also ein ähnliches Ergebnis hervorbringen, wenn es für status max. zwei Werte gibt. Wenn es mehr Werte gibt, muss man die Query wohl anders aufbauen. Aber dazu müsste ich die Struktur kennen, bzw. wissen, welche Werte status anneghmen kann

Du kannst natürlich auch zwei Schleifen mit jeweils eigenem if Konstrukt bauen - in der ersten gibst du die roten Zeilen aus, in der zweiten die anderen. Das wäre für dich vielleicht einfacher, aber dann hättest du doppelt soviele Queries wie Kunden, wovon ich abraten würde

03.12.2007 12:34 | geändert: 03.12.2007 12:35

7 Frank

Also bei Kunden gibt es nur ID (eine eindeutige Zahl) und Name (der Kundenname)

Bei Bestand gibt es mehrere Spalten. Wichtig ist die Spalte "Kunde" dort steht die ID von "Kunden" drin und die Spalte "status" da steht bei einem neuen Eintrag "neu" drin.

Daher soll dann überprüft werden, ob es pro Kunden einen oder mehrere neue Einträge in der Datenbank gibt.

Wenn ja, dann sollen dieser Kundenname dann rot markiert und angezeigt werden, wenn nicht, dann ohne rote Markierung.

In dem select-Element sollen dann alle Kundenangezeigt werden beginnend mit denen die "neue" Einträge haben und dann die restlichen ohne.

03.12.2007 13:38

8 Frank

Kleine Anmerkung. Den Code den ich hier hinterlegt habe kann einfach getestet werden dann würden Sie auch das gleiche Ergebnis angezeigt bekommen wie ich. Dieser müsste nur noch abgerundet werden! ;-)

03.12.2007 13:46

9 Jörg Kruse

Und wieviele und was für Werte kann status nun annehmen?

Wenn statt Strings wie 'neu' Zahlen wie 0 und 1 verwendet würden, z.B. 0 für 'neu' und 1 für 'alt', dann könnte man hier einfach mit MIN und GROUP BY arbeiten. Also ungefähr so:

SELECT Kunden.ID, Kunden.Name, MIN(Bestand.status) AS MinStatus FROM Kunden JOIN Bestand ON Kunden.ID = Bestand.kunde GROUP BY Kunden.ID ORDER BY MinStatus, Kunden.ID ASC

Wenn MinStatus == 0, dann gibt es für die betreffende ID mindestens ein Vorkommen status == 0, ist also mind. ein Eintrag 'neu'. Bei MinStatus = 1 gibt es dagegen keine neuen Einträge

Mit einem String 'neu' geht das so leider nicht; vielleicht mit einer Subquery? Aber da müsste ich auch nochmal genauer recherchieren, oder vielleicht kennt jemand anders eine angemessene Lösung

03.12.2007 14:18 | geändert: 03.12.2007 14:21

10 Frank

Wenn das so funktioniert, dann werde ich die Inhalte halt ändern statt "neu" dann 1 und "alt" dann 0.

Wie sieht denn dann genau der Code aus (mein zugesandter Code angepasst mit deinem Vorschlag)?

03.12.2007 14:52