Hvordan lenke og vise MySQL data fra to ulike tabeller?

stemmer
0

Jeg har to tabeller som heter statistikk og brukere

brukere tabellen har alle de typiske brukerdata som id, brukernavn, passord, e-post (kolonner)
statistikk tabellen har id, angrep, forsvar, ostats, gull, mat (kolonner)

Jeg ønsker å vise data fra disse to bord ved siden av hverandre og har data knyttet sammen gjennom sine IDS For eksempel,

 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

Brukernavn er fra bord brukere og resten av dem er fra table statistikken

Så første jeg ønsker å vite hvordan å knytte og vise data fra samme ID, som brukernavn (user_id = 1) og ostats, angrep, forsvar, gull, mat (id = 1)

Så jeg vil ha dem i rekkefølge etter deres ostats (jeg har ikke en kolonne som heter rang i ethvert bord ennå, bare ikke vet hvordan å skape rang ved hjelp av generelle statistikker)

Publisert på 19/09/2018 klokken 13:21
kilden bruker
På andre språk...                            


2 svar

stemmer
1

Du kan gjøre noe sånt (utestet)

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;

Mulig løsning til rangering:

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;

En annen, fryktelig ser forsøket:

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;

Her i PHP-kode, må du kjøre den som to spørsmål å stille variable, deretter kjøre selve rangeringen spørringen. På denne måten er det rang variable alltid satt til 0 ved kjøring av denne. Legg merke til at jeg har brukt ulike bord og kolonne navnene, bare for å forenkle ting litt. Husk å tilpasse seg dine spesifikke behov.

// 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); 
}

For meg ser resultater dump som dette:

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)
Svarte 19/09/2018 kl. 13:32
kilden bruker

stemmer
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" } }

Dette vises etter bruk av koden din, men som vanlig arrays starte med 0, så det går fra Rank 0 til Rank 9, der som jeg har 10 brukere rangert her, ønsker jeg å starte 0 = 1 (fra 1) og deretter hvordan du ekko som bestemt nummer (rank nummer) fra denne matrisen? Jeg prøvde echo $ranks[1];, men det gir meg feilmeldingen "Fatal error: uoppfanget Feil: Kan ikke bruke objekt av typen mysqli_result som array i"

I prøvd på vanlig måte, mens sløyfen og hente 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); }


Når jeg echo $row['rank'];det reflekterer IDer av spillere (user_id fra brukere) i DESC rekkefølge av generelle statistikker og ikke selve gradene.

Jeg prøvde echo $row[1];, men det gir meg feil av "Notice: Undefined offset: 1 i"

Så hva gjør jeg galt her?

Jeg antar at noe gikk galt med

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

Årsak det er den eneste delen jeg ikke forstår, jeg må erstatte disse med noe?

Svarte 21/09/2018 kl. 11:29
kilden bruker

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