#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. а, понятно. Поэтому каждый раз, когда я добавляю новый элемент в свою игру, мне нужно обновлять этот код.. Хорошо, спасибо.