Cómo enlazar y mostrar datos de MySQL a partir de dos tablas diferentes?

votos
0

Tengo dos tablas llamado estadísticas y usuarios

tabla de usuarios tiene todos los datos de usuario típicos como la identificación, nombre de usuario, contraseña, correo electrónico (columnas)
Totales tabla tiene identificación, ataque, defensa, ostats, oro, comida (columnas)

Quiero mostrar los datos de estos dos mesas al lado del otro y tienen los datos vinculados a través de sus IDS por ejemplo,

 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

Nombre de usuario es de usuarios de mesa y el resto de ellos son de estadísticas de mesa

Así que primero me gustaría saber cómo vincular y visualizar los datos de la misma identificación, como nombre de usuario (user id = 1) y ostats, ataque, defensa, oro, comida (id = 1)

A continuación, los quiero en orden por sus ostats (no me he una columna denominada rango en cualquier mesa, sin embargo, simplemente no saben cómo crear el rango usando las estadísticas generales)

Publicado el 19/09/2018 a las 13:21
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
1

Se podría hacer algo así (no probado)

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;

Posible solución para la clasificación:

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;

Otro intento de aspecto horrible:

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;

Aquí en código PHP, usted tiene que funcionar como dos consultas para establecer la variable, a continuación, ejecutar la consulta clasificación real. De esta manera, la variable de rango siempre se establece en 0 cuando se ejecuta este. Tenga en cuenta que he utilizado diferentes nombres de tablas y columnas, para simplificar las cosas un poco. Recuerde que debe adaptarse a sus necesidades específicas.

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

Para mí, el volcado resultados es el siguiente:

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)
Respondida el 19/09/2018 a las 13:32
fuente por usuario

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

Esto se visualiza después de usar su código, pero como matrices habituales comienzan con 0, por lo que va de Rango 0 a Rango 9, donde como tengo 10 usuarios clasifican aquí, quiero que comience a 0 = 1 (de 1) y luego cómo eco que número particular (número de rango) a partir de esta matriz? He intentado echo $ranks[1];pero me da error "Fatal error: Error no detectada: No se puede utilizar el objeto del tipo mysqli_result como matriz en"

Probé la forma habitual de bucle while a buscar 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); }


Cuando echo $row['rank'];se hace eco de identificación de jugadores (user_id de los usuarios) en orden descendente por las estadísticas generales y no a las filas reales.

He intentado echo $row[1];pero me da error de "Notice: Undefined offset: 1 en"

Entonces, ¿qué estoy haciendo mal aquí?

Asumo que algo salió mal con

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

Porque eso es la única parte que no entiendo, qué he tenido que sustituirlos por algo?

Respondida el 21/09/2018 a las 11:29
fuente por usuario

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