Как связать и отображение данных MySQL из двух разных таблиц?

голоса
0

Я две таблицы под названием «статистика» и «пользователи»

Таблица пользователей имеет все типичные пользовательские данные , такие как идентификатор, имя пользователя, пароль, адрес электронной почты (столбцы)
STATs таблица имеет идентификатор, атака, защита, ostats, золото, продукты питания (столбцы)

Я хочу, чтобы отобразить данные из этих двух таблиц бок о бок, и есть данные, связанные через их IDS Например,

 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

Имя пользователя от таблицы «пользователей» , а остальные из них из таблицы «Статистика»

Итак , сначала я хочу знать , как связать и отображать данные из того же ID, как Имя пользователя (user_id = 1) и ostats, атака, защита, золото, продукты питания (ID = 1)

Тогда я хочу их в порядке их «ostats» (я не имею столбца с именем «рангом» в любой таблице пока, просто не знает, как создать ранг, используя общую статистику)

Задан 19/09/2018 в 13:21
источник пользователем
На других языках...                            


2 ответов

голоса
1

Вы могли бы сделать что-то вроде (непроверенные)

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;

Возможное решение рейтинг:

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;

Другой, ужасно выглядящая попытка:

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;

Вот в PHP коде, вы должны запустить его как два запроса, чтобы установить переменную, а затем запустить фактическое ранжирование запроса. Таким образом, переменная ранг всегда устанавливается в 0 при выполнении этого. Обратите внимание, что я использовал различные имена таблиц и столбцов, просто чтобы упростить вещи немного. Помните, чтобы приспособиться к конкретным потребностям.

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

Для меня, свалка результатов выглядит следующим образом:

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)
Ответил 19/09/2018 d 13:32
источник пользователем

голоса
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" } }

Это отображается после того, как с помощью кода , а как обычные массивы начинаются с 0, так что это идет от ранга 0 до ранга 9, где , как у меня есть 10 пользователей попал сюда, я хочу, чтобы начать 0 = 1 (из 1) , а затем , как эхо конкретного числа (номер ранга) из этого массива? Я пытался , echo $ranks[1];но он дает мне ошибку «Фатальная ошибка: неперехваченным Ошибка: Не удается использовать объект типа mysqli_result как массив в»

Я попробовал обычный путь в то время как петли и выборки доц

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


Когда я echo $row['rank'];это эхо корочки игроков (user_id от пользователей) в порядке DESC от общей статистики , а не фактические ранги.

Я попытался , echo $row[1];но это дает мне ошибку «Примечание: Не определено смещение: 1 в»

Так что я здесь делаю неправильно?

Я полагаю, что-то пошло не так

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

Потому что это только часть я не понимаю, я должен заменить их чем-то?

Ответил 21/09/2018 d 11:29
источник пользователем

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