Seite 1 von 1

Problem mit SQL Abfragen

Verfasst: 17.10.2005 17:08
von andinator
Ich frage mit nachfolgendem Script die reichsten 10 User ab, aber ich möchte noch die Bankkreuzer dazu zählen, also was die leute in ihrer bank haben, doch da die sql abfrage schon nur die 10 reichsten (aber eben nur normale kreuzer) abfrägt und ordnet, wären bei entfernen der kommentarzeichen zwar die bankkreuzer dazugezählt, aber die leute stehen immer noch in der reihenfolge der normalen kreuzer. und leute, die bar nichts haben sondern nur auf der bank werden auch nicht angezeigt, ich weiß, ist schwer zu erklären bzw. zu verstehen.

Code: Alles auswählen

//
// Reichste User TOP 10
//

$display_limit = 10;
$i = 0;
$sornot = $lang['Richest_users'];
$sql = "SELECT user_id, username, user_kreuzer
        FROM phpbb_users
        WHERE user_id > -1
        ORDER BY user_kreuzer DESC
        LIMIT ".$display_limit;
if ( !($result = $db->sql_query($sql)) )
{
message_die(GENERAL_ERROR, "Couldn't retrieve users data", "", __LINE__, __FILE__, $sql);
}
$user_countusers = $db->sql_numrows($result);
$user_data = $db->sql_fetchrowset($result);
for ($i = 0; $i < $user_countusers; $i++)
{
/*$sql1 = "select * from phpbb_bank where name=".$i;
if ( !($result1 = $db->sql_query($sql1)) ) { message_die(CRITICAL_ERROR, 'Error Getting Bank Users!<br>'.mysql_error()); }
$row = mysql_fetch_array($result1);
if (is_numeric($row['holding']))
{
$richi = $user_data[$i]['user_kreuzer'] + $row['holding'];
}
else
{*/
$richi = $user_data[$i]['user_kreuzer'];
//}
$richest_user = $user_data[0]['username'];
$richest_uid = $user_data[0]['user_id'];
$richests_cash = $richi . '&nbsp;Kreuzer';
$place = $i+1;
$template->assign_block_vars('richestrow', array(
'USERNAME' => $user_data[$i]['username'],
'URL' => '<a href="' . append_sid("profile.$phpEx?mode=viewprofile&" . POST_USERS_URL . "=".$user_data[$i]['user_id']."") . '">',
'CASH' => $richests_cash,
'PLACE' => $place .'.&nbsp;')
);
}
Wenn's jemand nicht kapiert hat aber helfen möchte kann er gerne im Thread fragen oder sich per Messenger bei mir melden.

Verfasst: 19.10.2005 07:28
von QCO
Also es gibt da zwei Möglichkeiten:
a) Du addierst die Guthaben in PHP (so wie es jetzt in deinem Code ist); dann musst du nach dem Addieren (was aber gleich für alle Leute passieren muss), die Liste nochmal sortieren.
Ich hab jetzt gerade geschaut, konnte aber keine PHP-Funktion finden, die nach einer bestimmten Spalte eines Arrays sortiert.
Also ist insgesamt b) günstiger.
b) Du lässt gleich in SQL addieren.

Code: Alles auswählen

SELECT u.user_id, u.username, u.user_kreuzer+b.holding AS credit
        FROM phpbb_users u LEFT JOIN phpbb_bank ON {BEDINGUNG}
        WHERE user_id > -1
        ORDER BY credit DESC
        LIMIT ".$display_limit; 
Bei {BEDINGUNG} musst du mal selbst was einsetzen, weil ich dein DB-Layout aus deinem Code heraus irgendwie nicht verstehe...

Verfasst: 19.10.2005 19:31
von andinator
danke erstmal
zum db-layout:
in der tabelle phpbb_users
sind nur relevant:
user_id username user_kreuzer

in der tabelle phpbb_bank folgende:
id name holding

wobei 'name' dem feld 'user_id' entspricht, aber nicht jede user_id ist in der phpbb_bank vertreten

user_kreuzer + holding sollen addiert werden und nach diesem ergebnis sortiert werden

-----

könntest du mir vllt. auch die 2te zeile erklären, die erste versteh ich.
was kann ich als bedingung einsetzen?
ich will ja is_numeric($row['holding']) als bedingung also left join blabla on is_numeric($row['holding']) oder wie?

-----
hatte nämlich zwischenzeitlich das so versucht, dass beide abgefragt werden und zusammengezählt, dann in ein neues feld eingefügt, und dieses wieder abgefragt und sortiert wird, was aber jedes mal einen RIESEN db-anfragen aufwand bedeutet, weil das immer gleich für alle user zusammengezählt wurde.

Verfasst: 25.10.2005 17:22
von andinator
so, ich hab zwei zabellen:
phpbb_users
phpbb_bank

das ergebnis sollen 10 user mit folgenden feldern jeweils sein:
username, user_id aus phpbb_users
und das ergebnis von:
phpbb_users user_kreuzer + phpbb_bank holding
wobei user_id aus phpbb_users = name aus phpbb_bank sein muss
das problem ist, dass nicht für jede user_id ein holding in phpbb_bank existiert.
was müsste ich also als Bedingung bei left join (s.o.) einsetzen?

wird mir doch jemand helfen können.... :(

Verfasst: 19.11.2005 15:09
von andinator
habs selber gelöst, für alle anderen hier die Lösung:

Code: Alles auswählen

$sql = "SELECT users.user_id, users.username, 
        CASE WHEN bank.holding THEN (users.user_kreuzer+bank.holding) ELSE users.user_kreuzer END
        AS sum FROM phpbb_users AS users LEFT JOIN phpbb_bank AS bank
        ON users.user_id = bank.name
        WHERE user_id <> -1
        ORDER BY sum DESC
        LIMIT ".$display_limit;