Сложна заявка към MySQL?

Ticketa

Registered
Здравейте.

Обмислях едни варианти и съм си структурирал базата данни по-възможно най-краткия и прост начин. Окей, хубаво. Сега обаче при извеждането на информацията, не се бях съобразил дали ще мога да направя това, което искам.

Имам 2 таблици(примерни)
`cars` и `car_features`

Сега в първата таблица, имам:
`id`, `title`, `fuel_id`, `doors_id`, `seats_id`

Във втората `car_features` имам:

`feat_id`, `feat_name`, `feat_parent`

Да предположим, че в таблицата `cars` имам информация:
id: 1
title: проба
fuel_id: 16
doors_id: 7
seats_id: 24

Сега, за да изведа тази информация правя следното:
SELECT * FROM `cars` AS `c`, `car_features` AS `f` WHERE `c`.`id`='1' AND `c`.`fuel_id`=`f`.`feat_id` AND `c`.`doors_id`=`f`.`feat_id`;

$query = mysql_query("SELECT * FROM `cars` AS `c`, `car_features` AS `f` WHERE `c`.`id`='1' AND `c`.`fuel_id`=`f`.`feat_id` AND `c`.`doors_id`=`f`.`feat_id`;") or die(mysql_error());
if(mysql_num_rows($query) > 0) {
$row = mysql_fetch_object($query);
echo "Кола: {$row->title} | врати: {$row->feat_name} | гориво: {$row->feat_name}";
} else {
echo "not found";
}

Ето го и въпроса ми. Как мога да изведа например горивото и вратите, без да създавам излишни заявки или да правя функции? Пак казвам. Това е прост код, който е само за примера. Въпроса ми е как да стане заявката и да извадя резултата за всяка отделна "функция"?

Надявам се да сте ме разбрали.

Послепис: Мислех да създам една функция, с която да взимам дадения резултат от таблицата features, нещо от вида на:
Код:
function test($ID, $act=1) {
if($act == 1) {
$query = mysql_fetch_object(mysql_query("SELECT * FROM `car_features` WHERE `feat_id`='$id';));
return $query->feat_name;
} else if ($act == 2) {
$query = mysql_fetch_object(mysql_query("SELECT * FROM `car_features` WHERE `feat_id`='$id';));
return $query->feat_name;
} else if ($act == 3) {
$query = mysql_fetch_object(mysql_query("SELECT * FROM `car_features` WHERE `feat_id`='$id';));
return $query->feat_name;
}
}

и после при извеждането:
Гориво: ".test($row->fuel_id, 1)."
Врати: ".test($row->doors_id, 2)."

и т.н. но това е.. доста не правилно. Надявам се някой да удари рамо :))
 
Left join ?
Код:
Select 
    cars.* , fuel_name, feat_name, door_name 
FROM `cars` 
LEFT JOIN fuels ON (cars.fueld_id = fuels.id)
LEFT JOIN feats ON (cars.feat_id = feats.id)
....

Твоят вариант не е лош, но в този случай ще правиш много заявки само за взимането на информацията на 1 кола ...
Можеш да направиш един builder на sql ready код и да му подаваш от коя таблица искаш да вземеш данни и той да ти връща нужните данни и заявката ти да стане нещо такова:
Код:
SELECT 
    cars.*, {$selectQuery}
FROM cars
{$joinQuery}
WHERE 1 {$whereClause}
Order By cars.id
И съответно функцията ти да е нещо подобно
Код:
private function _buildCarsQuery(array $fields){
$selectQuery = '';
$joinQuery = '';
$whereClause = '';
if(isset($fields['fuel'])){
$selectQuery .= 'fuel_name, fuel_type,';
$joinQuery .= 'LEFT JOIN fuels ON (cars.fuel_id = fuels.id)';
}
$selectQuery = rtrim(',', $selectQuery);
//форматираш си като цяло да са валидни данните преди да ги върнеш
return array($selectQuery, $joinQuery, $whereClause);
}

и после 
list($selectQuery, $joinQuery, $wherClause) = $this->_buildCarsQuery(array('fuel', 'doors'));
$query = 'SE....';
И в общи линии така според мен ще ти е най-удобно и най-преизползваем кода :)
ПП: кода го написах в коментара, така че е напълно нормално да ма тук таме някакви грешки
ПП2: Ако не се лъжа mysql_fetch_object е доста бавно, по-добре си ползвай mysql_fetch_assoc - ако не съм прав моля да ме поправите, за да не бъркам човека :)
ПП3: Можеш и с PDO / mysqli тъй като не е препоръчително вече да се ползват mysql_* функциите :?:
 

Back
Горе