verschachtelte while-Schleifen?
- leopittoni
- Mitglied
- Beiträge: 1162
- Registriert: 26.04.2004 20:17
verschachtelte while-Schleifen?
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
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
Du musst halt in der zweiten Schleife mit einem anderen Rückgabekennung ($result2 oder so) und einer anderen Ausgabe ($row2) arbeiten.
Gruß, Philipp
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
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
- leopittoni
- Mitglied
- Beiträge: 1162
- Registriert: 26.04.2004 20:17
- leopittoni
- Mitglied
- Beiträge: 1162
- Registriert: 26.04.2004 20:17
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.
$order = $max - $zahl;
Es sollen nun die namen der users ausgegeben werden, sortiert nach $order.
Ungefähr klar?
Vielen Dank!
Léo
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;
}
Es sollen nun die namen der users ausgegeben werden, sortiert nach $order.
Ungefähr klar?
Vielen Dank!
Léo
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
- leopittoni
- Mitglied
- Beiträge: 1162
- Registriert: 26.04.2004 20:17
Hallo!
Nein, leider kann man nicht einfach (c.rang *10) machen... Die $max sind nicht immer proportional zum Rang...
Das ist der Code, der momentan halt noch nach Anzahl einsätze sortiert...
("rangpunkte" waren im Bsp. "einsätze")
Léo
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";
("rangpunkte" waren im Bsp. "einsätze")
Léo
- leopittoni
- Mitglied
- Beiträge: 1162
- Registriert: 26.04.2004 20:17
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
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
mfg metty
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.