verschachtelte while-Schleifen?

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
Benutzeravatar
leopittoni
Mitglied
Beiträge: 1162
Registriert: 26.04.2004 20:17

verschachtelte while-Schleifen?

Beitrag von leopittoni »

Hallo

Kann mir jemand sagen, wie man verschachtelte While-Schleifen mit SQl-Abfragen macht?

Skizze:

SQL-Abfrage mit bestimmten Limit

while SQL-QUERY
{
$user_id = row[3];

andere SQL-Abfrage blabla where id = "$user_id" mit anderen Limit usw.
while SQL-QUERY
{
}

}

Geht so leider nicht. Problem liegt wohl daran, dass ich gleich die mySQL Ergebnisse benutzen möchte...
Die mySQL-Abfragen kann ich auch nicht zusammenfügen, wie gesagt habe ich verschiedenen limits und so weiter..

Danke für Eure Hilfe!

Léo
PhilippK
Vorstand
Vorstand
Beiträge: 14662
Registriert: 13.08.2002 14:10
Wohnort: Stuttgart
Kontaktdaten:

Beitrag von PhilippK »

Du musst halt in der zweiten Schleife mit einem anderen Rückgabekennung ($result2 oder so) und einer anderen Ausgabe ($row2) arbeiten.

Gruß, Philipp
Kein Support per PN!
Der Sozialstaat ist [...] eine zivilisatorische Errungenschaft, auf die wir stolz sein können. Aber der Sozialstaat heutiger Prägung hat sich übernommen. Das ist bitter, aber wahr. (Horst Köhler)
Meine Mods
Benutzeravatar
leopittoni
Mitglied
Beiträge: 1162
Registriert: 26.04.2004 20:17

Beitrag von leopittoni »

Stimmt, hatte eins übersehen.

Danke!

Andere mySQL Frage:

Wie kann ich eine mySQL Abfrage im Nachhinein umsortieren?
Ich müsste mySQL-Daten abfragen, mit denen herumrechnen (mit PHP) und dann die Daten nach dem Wert der Rachnung sortieren,...

Jemand ne Idee?

Danke! Léo
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag von Pyramide »

Theoretisch schon ([php:usort]), in der Praxis habe ich das aber in der Form noch nie benötigt und ich kann mir auch keine Situation vorstellen, wo das sinnvoll wäre. Beschreib doch mal, was du erreichen willst - vermutlich gibt es eine viel einfachere Lösung.
KB:knigge
Benutzeravatar
leopittoni
Mitglied
Beiträge: 1162
Registriert: 26.04.2004 20:17

Beitrag von leopittoni »

Ok!

Was ich habe:

Habe eine Tabelle customers mit
id ... namen ... rang ... usw

eine Tabelle einsätze mit
id ... datum ... usw.


Was es geben soll:
Eine Liste mit 5 Namen

Sortiert:

- Zuerst müssen alle einsätze (aus "einsätze") als id gruppiert werden und gezählt werden (count ->$zahl)
-> Gibt also zu jeder id eine gweisse $zahl

Nun soll mittels if-Abfrage noch übrprüft werden, was für ein rang jede id hat, und die Variabel $max wird dementsprechen definiert.

Code: Alles auswählen

if (rang=="1")
{
$max=10;
}
else if (rang=="2")
{
$max=20;
}
$order = $max - $zahl;

Es sollen nun die namen der users ausgegeben werden, sortiert nach $order.

Ungefähr klar?

Vielen Dank!

Léo
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag von Pyramide »

Code: Alles auswählen

SELECT c.name
FROM customers c
LEFT JOIN einsaetze e ON (c.id = e.customer_id)
GROUP BY c.id
ORDER BY (c.rang * 10) - COUNT(e.einsatz_id)
KB:knigge
Benutzeravatar
leopittoni
Mitglied
Beiträge: 1162
Registriert: 26.04.2004 20:17

Beitrag von leopittoni »

Hallo!

Nein, leider kann man nicht einfach (c.rang *10) machen... Die $max sind nicht immer proportional zum Rang...

Code: Alles auswählen

$limit = 5;

$miniid = "SELECT c.customers_id, c.customers_firstname, c.customers_lastname, c.customers_rang, COUNT(r.customers_id) As zahl
FROM rangpunkte r, customers c
WHERE c.customers_id = r.customers_id && c.customers_rang < 5
GROUP BY r.customers_id
ORDER BY zahl DESC, c.customers_firstname LIMIT $limit";
Das ist der Code, der momentan halt noch nach Anzahl einsätze sortiert...
("rangpunkte" waren im Bsp. "einsätze")

Léo
Benutzeravatar
leopittoni
Mitglied
Beiträge: 1162
Registriert: 26.04.2004 20:17

Beitrag von leopittoni »

Kann niemand helfen?

Danke, Léo
Benutzeravatar
metty84
Mitglied
Beiträge: 159
Registriert: 08.03.2007 13:13
Wohnort: Marienberg
Kontaktdaten:

Beitrag von metty84 »

OH HA! starker toback!!!!! quick an dyrty variante wäre die zwei tabellen mit left join gesamelt auslesen, sie in ein aray pachen dort berechnen und sortieren. aber we du das machst und vileicht nen paarhundert datensätze (oder mehr) in den tabellen hast dan kackt dir der server ab weil die datenmenge riesig wird und das haufen prozessor- und arbeitsspeicherleistung frist. also wirstes wohl ordentlic machen müssen.

also alles über die sqlabfrage abklären und das ist net so einfach!
zuerstmal müstest du mit LEFT OUTER JOIN arbeiten damit auch customer ohne eintrag in der einsaetze tabelle berücksichtigt werden.

dan kannst du einen wert definieren den du mit einer if abfrage inerhalb des sqlbefehls definierst z.b. so

Code: Alles auswählen

(CASE WHEN zahl = 1 THEN 10 ELSE (CASE WHEN zahl = 2 THEN 20 ELSE 0 END) END) AS rang

schwiereig wirds nur beim zählen der einsätze! den mit count zählst du immer nur die gesamtanzahl der zeilen des ergebnisses von welcher der wert der angegebenen spalte nicht NULL ist.

eine lösung wäre es wen du die anzahl an einsätzen in der customer tabelle mit speicherst und dan mit dieser zahl arbeitest.

völlig andere herangehensweise wäre es die abfragen in sich zu schachteln jedoch weis ich nicht wie es da mit der übergabe der inhalte der äußeren abfrage zur inneren aussieht! fals es klapt wäre es die lösung deines problems fals nicht zurück zu plan a

Code: Alles auswählen

SELECT (SELECT count(*) FROM einsaetze WHERE customer_id = id) AS zahl, (CASE WHEN zahl = 1 THEN 10 ELSE (CASE WHEN zahl = 2 THEN 20 ELSE 0 END) AS rang, id, customers_firstname, customers_lastname  
FROM customers 
GROUP BY id
ORDER BY rang DESC
LIMIT 5

mfg metty
Nichts auf der welt ist so gerecht verteilt wie der Verstand.Denn jederman ist überzeugt das er genug davon habe.
Antworten

Zurück zu „Coding & Technik“