I doubt it would be more optimal because you are adding more tables to the query and in most cases the join would be null (you add the tables for real estate, but no listing is real estate,...)
I think the "best" way to do this, is to do the search, then loop through the items (without showing them) and put in one array the ID of those that are cars, in another those that are real estate. Then, query the database for those items (one query for each, one for cars and another for real estate. Finally, show the listings with the added data of those queries. Something like
(pseudo code)
$items = .... from the search...
$cars = array();
$realestate = array();
foreach($items as $item) {
if(item category == cars) {
$cars[] = item id
} else if(item category == cars) {
$realestate[] = item id
}
}
$carsdata = query(SELECT * FORM tbl_plugin_cars WHERE id IN ($cars));
$realestate = query(SELECT * FORM tbl_plugin_realestate WHERE id IN ($realestate));
foreach($items as $item) {
// HTML, SHOW LISTING
if (item is cars) {
// SHOW ADDITIONAL CARS DATA FROM $carsdata
}
...
}