Jump to content

Need help with db query!


hga77

Recommended Posts

I have two tables. codes and users. The codes table holds the unique codes along with a reference key which is the user_id, to link to the users table.

They look like this:

table 1:[b]users[/b]{[u]user_id[/u], name}
table 2:[b]codes[/b]{[u]the_codes[/u], user_id, final_score, seconds}

Users must answer 10 questions in the fastest time. This query is needed for the leaderboard.

Lets fill those tables with data:

[b]users[/b]
user_id     name
-------    ------
1             Jim
2             Bob
3             Lee
4             Peter

[b]codes[/b]
the_codes     user_id      final_score      seconds
----------    --------     -----------     -----
1111               1                10               5
2222               1                10               4
3333               1                6                 2
4444               3                10               8
5555               4                8                 8

[b]Result I need after query:[/b]
the_codes     user_id      final_score      seconds    name
----------    --------     -----------     -----       ------
2222               1                10               4           Jim
4444               3                10               8           Lee
5555               4                8                 8          Peter

**notice the order from top to bottom, heighest score with lowest time, and without duplicating all the scores for Jim, just his best score!

Now I need to query those two tables and get a list of scores (dont want scores by the same user, just one score per user being the best score ofcourse) starting with the highest score with the lowest time, onwards. I can do this fine, but I cant remove the duplicates. I have tried Distict 'user_id', Group By 'user_id', Union etc. But I'm not an SQL master so I dont really know advanced sql.

This is the current sql Im using:

$sql = "SELECT * FROM codes, users WHERE codes.user_id=users.user_id ORDER BY final_score DESC, seconds ASC";

Please tell me how I can modify this so I dont get those annoying duplicates and still get the best score per user.

Thank you.
Link to comment
Share on other sites

I'm not sure right off how you'd limit your results to your restrictions with a single query because of the aggregates that would have to be used, but you could use something like this to filter your results, and you'd be good to go:
[code]
<?php
$sql = mysql_query("SELECT u.name, c.* FROM codes c, users u WHERE c.user_id = u.user_id ORDER BY final_score DESC, seconds ASC");
if (mysql_num_rows($sql) > 0) {
  $res = array();
  // since we know that the first record will be their best, we simply list their first record alone:
  while ($x = mysql_fetch_array($sql)) {
    if (!isset($res[{$x['user_id']}])) {
      $res[{$x['user_id']}] = $x;
    }
  }
}
?>
[/code]

Now, your $res variable contains an array of ONLY one score per user. You can loop through it with the foreach(), and you can display them as you see fit.

Hope this helps
Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.