Problem mit SQL Abfragen

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
andinator
Mitglied
Beiträge: 97
Registriert: 30.07.2004 16:15

Problem mit SQL Abfragen

Beitrag 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.
Benutzeravatar
QCO
Mitglied
Beiträge: 708
Registriert: 15.03.2003 12:30
Wohnort: Leipzig

Beitrag 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...
Schnelle direkte Hilfe? Modeinbau? Umfassender, persönlicher Support? Ein individuelles Design/Template?
Ich bin käuflich und löse zu kleinen Preisen Deine Probleme. Anfragen bitte per PN oder Mail.
andinator
Mitglied
Beiträge: 97
Registriert: 30.07.2004 16:15

Beitrag 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.
andinator
Mitglied
Beiträge: 97
Registriert: 30.07.2004 16:15

Beitrag 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.... :(
andinator
Mitglied
Beiträge: 97
Registriert: 30.07.2004 16:15

Beitrag 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;
Antworten

Zurück zu „Coding & Technik“