Seite 1 von 1

verschachtelte while-Schleifen?

Verfasst: 14.04.2008 14:56
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

Verfasst: 14.04.2008 15:00
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

Verfasst: 14.04.2008 15:45
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

Verfasst: 14.04.2008 16:19
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.

Verfasst: 14.04.2008 16:32
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

Verfasst: 14.04.2008 16:39
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)

Verfasst: 14.04.2008 16:45
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

Verfasst: 11.05.2008 12:11
von leopittoni
Kann niemand helfen?

Danke, Léo

Verfasst: 12.05.2008 03:23
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