The total cost of four direct queries is likely to be much less than the cost of JOIN plus the search for the same records / fields.
In any case, check the capabilities of the FULLTEXT index.
Anyway you can do it with
SELECT "cmw_admin" as source, id FROM cmw_admin, NULL as date [...] WHERE bio LIKE '%search%' UNION SELECT "cmw_blog" as source, id FROM cmw_admin, date as date [...] WHERE (title LIKE '%search%' OR content LIKE '%search%') UNION ...
which will provide you with a list of found entries along with a hint where the entry came from ("cmw_admin", "cmw_blog", ...) allowing you to choose how to submit records from various sources.
A query will always return the same set of fields, some with valid values, some not, depending on what the "source" is. Then in your PHP script you can do something like
$source = $record['source']; if (!isset($template[$source])) $template[$source] = file_get_contents("templates/search/$source.html"); $html_view = preg_replace('#{{\s*([^}\s]*)\s*}}#e', 'isset(\$record["\1"])?\$vars["\1"]:""', $template[$source]);
It takes an HTML template containing an HTML snippet like
<h2>{{ date }}</h2>
and "populate" the field with the [date] entry of the current $ record. I believe this is a good way to keep HTML and code separate (YMMV). If you already have a template system, you can (and should!) Adapt this option instead.
LSerni
source share