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