sql-запрос упростить?

#sql

#sql

Вопрос:

Я должен извлекать данные из таблицы базы данных на основе результата из другой таблицы. Сначала я упомяну таблицы и для чего они предназначены.

db_vehicles — Эта таблица представляет собой базу данных всех транспортных средств. Он содержит имя, краткое имя, скорость и другую информацию. (Например, name = Спортивный автомобиль, shortname = спорт, скорость = 10)

Пример;

 id        name       shortname      speed    
 1    'Sports Car'    'sports'        7      
  

items_vehicles = В этой таблице хранится запись автомобилей игроков, каждый столбец является кратким именем для каждого автомобиля в db_vehicles. (например, грузовики = 5, спорт = 8, велосипеды = 3)

Пример;

 id    player    bike    sports    truck
1       1        5        7         0
  

В основном, что мне нужно сделать, это проверить, что игрок действительно владеет транспортным средством, которое он «оборудовал» ($ vehicle). Это проверяет таблицу items_vehicles, но чтобы найти столбец в этой таблице, сначала нужно проверить таблицу db_vehicles, чтобы получить ‘shortname’.

Вот код, который я использую в настоящее время:

 $vehicle = "Sports Car"; // example

if ($vehicle != "") { //if the players has a vehicle 'equipped'

    $sql_result2 = mysql_query("SELECT shortname FROM db_vehicles WHERE name='$vehicle'", $db);  
    $rs2 = mysql_fetch_array($sql_result2);

    //we have the shortname, now check to see if he has any

    $sql_result3 = mysql_query("SELECT * FROM items_vehicles WHERE player='$id'", $db);
    $rs3 = mysql_fetch_array($sql_result3);

    // now if he has none, make $vehicle empty

    if ($rs3[$rs2[shortname]] < 1) { 
        $vehicle="";
        }
  

Есть ли лучший способ сделать это? Может быть, с помощью одного запроса с использованием подзапросов или чего-нибудь еще?

Причина, по которой он мне нужен, заключается в том, что я делаю это четыре раза при каждой загрузке страницы, он проверяет транспортные средства, оружие, снаряжение и рукопашный бой. (Это для игрового скрипта)

Обновить

Я пытался использовать что-то подобное, но не работает:

  $sql_result2 = mysql_query("SELECT * FROM items_vehicles WHERE items_vehicles.(SELECT shortname FROM db_vehicles WHERE name='$vehicle')=db_vehicles.shortname WHERE items_vehicles.player='$id'", $db); 
  

Комментарии:

1. Может быть, если вы предоставите полный список полей для обеих таблиц и пример набора строк для каждой. Может быть внешний ключ, к которому вы могли бы присоединиться или что-то в этом роде. Не совсем ясно, так ли это, исходя из ограниченной информации в вопросе.

2. обновлено исходное сообщение, чтобы показать, что

Ответ №1:

Я не уверен в точной базе данных, которую вы используете, но общее решение SQL — это внутреннее соединение (оно будет использовать синтаксис SQL Server):

 SELECT * 
  FROM items_vehicles
 WHERE player='$id'
   AND 1 >= CASE (SELECT shortname 
                   FROM db_vehicles
                  WHERE name='$vehicle') 
                WHEN 'sports' THEN sports
                WHEN 'bike' THEN bike
                // add more here
                ELSE 0
           END
  

Комментарии:

1. там нет ‘items_vehicles.shortname’. Все столбцы в items_vehicles названы в честь кратких названий транспортных средств, например «спорт», «велосипед», «грузовик» и т.д.

2. Ах, сколько у вас столбцов? Есть ли у вас возможность изменить дизайн таблицы?

3. в items_vehicles у меня, вероятно, 10 столбцов, по одному для каждого транспортного средства, идентификатора и столбца игрока.

4. Хорошо, я обновил ответ, чтобы показать извлечение данных в одном запросе. По сути, оператор where извлекает соответствующий столбец на основе короткого имени и оценивает его с точностью до 1, что означает, что оператор were вернет значение только тогда, когда в соответствующем столбце есть ненулевое значение.

5. а, понятно. Поэтому каждый раз, когда я добавляю новый элемент в свою игру, мне нужно обновлять этот код.. Хорошо, спасибо.