Comment lier et afficher les données MySQL à partir de deux tables différentes?

voix
0

J'ai deux tables nommées « statistiques » et « utilisateurs »

table des utilisateurs a toutes les données utilisateur typiques comme identifiant, nom d' utilisateur, mot de passe, email (colonnes)
stats table a id, attaque, défense, ostats, l' or, la nourriture (colonnes)

Je veux afficher les données de ces deux tables côte à côte et ont les données liées par leurs IDS Par exemple,

 Rank   user_uid   ostats     attack    defense    gold 
   1    Test        10          5         5        100
   2    Test2       8           2         6        60
   3    Test3       6           5         1        40

Nom d' utilisateur est de table « utilisateurs » et le reste d'entre eux sont de table « stats »

Alors d' abord je veux savoir comment lier et afficher les données de la même ID, comme nom d' utilisateur (user_id = 1) et ostats, attaque, défense, or, la nourriture (id = 1)

Ensuite, je les veux dans l'ordre par leurs « ostats » (je n'ai pas une colonne nommée « rang » encore dans une table, ne savent pas comment créer le rang en utilisant les statistiques globales)

Créé 19/09/2018 à 13:21
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
1

Vous pouvez faire quelque chose comme (non testé)

SELECT u.username, s.overall, s.attack, s.defense, s.gold 
FROM stats s JOIN users u on s.user_uid = u.id 
ORDER BY s.overall;

Solution possible au classement:

set @row_number=0;
SELECT (@row_number:=@row_number+1) as rank, u.username, s.overall, s.attack, s.defense, s.gold 
FROM stats s JOIN users u on s.user_uid = u.id 
ORDER BY s.overall;

Une autre, horrible tentative d'apparence:

set @row_number = (select count(*) from users) + 1;
select (@row_number:=@row_number-1) as rank,  u.username, s.overall from 
stats s join users u on s.user_uid = u.id order by s.overall desc;
set @row_number = 0;

Ici, dans le code PHP, vous devez l'exécuter comme deux requêtes pour définir la variable, puis exécutez la requête classement réel. De cette façon, la variable de rang est toujours à 0 lors de l'exécution de cette. Notez que je l'ai utilisé différents noms de tables et de colonnes, pour simplifier les choses un peu. N'oubliez pas de s'adapter à vos besoins spécifiques.

// connect to database
$conn = mysqli_connect("localhost", "user", "password", "database");
// this query will set a variable to 0.
$setSql = "SET @row_number = 0;";
// run the query. This will return a boolean - true or false, depending on whether or not the query ran successfully
$variableSet = mysqli_query($conn, $setSql);
// if the query ran successfully
if($variableSet){
    // setup the actual ranking query
    $statsSql = "select 
                     (@row_number:=@row_number+1) as rank,
                     u.id,
                     u.username,
                     s.overall
                 from
                     mstats s 
                 join 
                     musers u
                 on 
                     s.muser = u.id
                 order by 
                     s.overall desc;";
    $ranks = mysqli_query($conn, $statsSql);
    if(!$ranks){
        // dump error from rank query
        var_dump($conn->error); 
    } else {
        // dump results as associative array
        var_dump($ranks->fetch_all(MYSQLI_ASSOC));
    }
} else {
    // dump errors from setting variable
    var_dump($conn->error); 
}

Pour moi, la décharge de résultats ressemble à ceci:

array (size=3)
  0 => 
    array (size=4)
      'rank' => string '1' (length=1)
      'id' => string '2' (length=1)
      'username' => string 'Bar' (length=3)
      'overall' => string '1000' (length=4)
  1 => 
    array (size=4)
      'rank' => string '2' (length=1)
      'id' => string '6' (length=1)
      'username' => string 'Tom' (length=3)
      'overall' => string '7' (length=1)
  2 => 
    array (size=4)
      'rank' => string '3' (length=1)
      'id' => string '1' (length=1)
      'username' => string 'Foo' (length=3)
      'overall' => string '3' (length=1)
Créé 19/09/2018 à 13:32
source utilisateur

voix
0
array(10) { [0]=> array(4) { ["rank"]=> string(1) "7" ["user_id"]=> string(1) "7" ["user_uid"]=> string(11) "Rubberguy12" ["ostats"]=> string(5) "90699" } [1]=> array(4) { ["rank"]=> string(1) "1" ["user_id"]=> string(1) "1" ["user_uid"]=> string(5) "Admin" ["ostats"]=> string(3) "351" } [2]=> array(4) { ["rank"]=> string(1) "2" ["user_id"]=> string(1) "2" ["user_uid"]=> string(13) "NotSoGodSpeed" ["ostats"]=> string(3) "330" } [3]=> array(4) { ["rank"]=> string(1) "8" ["user_id"]=> string(1) "8" ["user_uid"]=> string(3) "Ram" ["ostats"]=> string(2) "20" } [4]=> array(4) { ["rank"]=> string(1) "9" ["user_id"]=> string(1) "9" ["user_uid"]=> string(12) "TestAccount1" ["ostats"]=> string(2) "20" } [5]=> array(4) { ["rank"]=> string(2) "10" ["user_id"]=> string(2) "10" ["user_uid"]=> string(4) "Ajit" ["ostats"]=> string(2) "20" } [6]=> array(4) { ["rank"]=> string(1) "3" ["user_id"]=> string(1) "3" ["user_uid"]=> string(9) "codoriano" ["ostats"]=> string(1) "0" } [7]=> array(4) { ["rank"]=> string(1) "4" ["user_id"]=> string(1) "4" ["user_uid"]=> string(9) "Adminwsda" ["ostats"]=> string(1) "0" } [8]=> array(4) { ["rank"]=> string(1) "5" ["user_id"]=> string(1) "5" ["user_uid"]=> string(15) "NotSoGodSpeed12" ["ostats"]=> string(1) "0" } [9]=> array(4) { ["rank"]=> string(1) "6" ["user_id"]=> string(1) "6" ["user_uid"]=> string(16) "NotSoGodSpeed120" ["ostats"]=> string(1) "0" } }

Ceci est affiché après avoir utilisé votre code , mais comme des tableaux habituels commencent par 0, il va de Rang 0 à Rang 9, où que j'ai 10 utilisateurs classés ici, je veux qu'il commence 0 = 1 (de 1), puis comment écho ce nombre particulier (numéro de rang) de ce tableau? J'ai essayé , echo $ranks[1];mais cela me donne l' erreur « Erreur fatale: Uncaught Erreur: Impossible d' utiliser l' objet de type mysqli_result sous forme de tableau dans »

J'ai essayé la manière habituelle de while chercher assoc

// this query will set a variable to 0.
$setSql = "SET @row_number = 0;";
// run the query. This will return a boolean - true or false, depending on whether or not the query ran successfully
$variableSet = mysqli_query($conn, $setSql);
// if the query ran successfully
if($variableSet){
    // setup the actual ranking query
    $statsSql = "select 
                     (@row_number:=@row_number+1) as rank,
                     u.user_id,
                     u.user_uid,
                     s.ostats
                 from
                     stats s 
                 join 
                     users u
                 on 
                     s.id = u.user_id
                 order by 
                     s.ostats desc;";
    $ranks = mysqli_query($conn, $statsSql);
    if(!$ranks){
        // dump error from rank query
        var_dump($conn->error); 
    } else {


        while ($row = mysqli_fetch_assoc($ranks)) {


       echo $row['rank'];

            echo "<br>";

        }


    }
} else {
    // dump errors from setting variable
    var_dump($conn->error); }


Quand je echo $row['rank'];fait écho à son des joueurs ID (de user_id des utilisateurs) dans l' ordre par les statistiques globales DESC et pas les rangs réels.

J'ai essayé , echo $row[1];mais cela me donne erreur de « Avis: Undefined offset: 1 »

Alors qu'est-ce que je fais mal ici?

Je suppose que quelque chose a mal tourné avec

"select (@row_number:=@row_number+1) as rank,"

Parce que c'est la seule partie que je ne comprenais pas, je ne dois les remplacer par quelque chose?

Créé 21/09/2018 à 11:29
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more