I recently worked on a very similar task with multiple drop-downs that contained tags.
First one simplified approach.
Add posts from selected categories to ONE drop-down with some style-filtering:
<form action="<?php $PHP_SELF ?>" name="searchbyname" id="searchbyname" >
<select name="nameselect">
<?php query_posts("cat=3,4&showposts=-1&orderby=title&order=asc"); ?>
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
<option <?php if(in_category(4)) echo 'style="font-weight: bold;"'; ?> value="<?php echo get_permalink(); ?>">
<?php the_title_attribute('before=&after=');?>
</option>
<?php endwhile; ?><?php else : ?><?php //smething ?><?php endif; ?>
</select>
<input type="button" name="Button1" value="Go" />
</form>
—–
With some java-script you could directly redirect on select.
Second, a form with multiple drop-downs that hold manually defined tags to output only posts that contain the chosen tag combination.
<form action="<?php $PHP_SELF ?>" method="post" name="searchbytags">
<select name="group1">
<option value="tag1">tag1</option>
<option value="notype">No Choice</option>
</select>
<select name="group2">
<option value="tag5">tag5</option>
<option value="notype">No Choice</option>
</select>
<input type="hidden" name="sent" value="1">
<input type="submit" name="Submit" value="search" />
</form>
—-
Some hints to capture the data submitted by 2nd. example:
<?php
$formfields = array("group1", "group2");
$formdata=$GLOBALS["_REQUEST"];
foreach ($formfields as $formfields2)
{
if ($formdata[$formfields2] !== "notype")
$tagsearchall = $tagsearchall . $formdata[$formfields2] . "+";
}
$tagsearchall = "tag=" . substr($tagsearchall, 0, -1); //remove last " + "
if ($tagsearchall !== "tag=+++") {echo "SEARCH TAG: $tagsearchall";}
?>
—–
Now pass $tagsearchall to the loop:
<?php if ($_REQUEST["sent"]){?>
<?php query_posts("$tagsearchall"); ?>
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
... continue as usual and do a lot of fancy stuff here.
Hope it helps.