Non l'ho provato e potrebbe esserci qualche errore, di certo si potrebbe ottimizzare, ma l'ho tirato giù al volo e dovrebbe comunque aiutarti nella soluzione.
Codice PHP:
//per brevità suppongo che le variabili associate alle query
//siano nei formati pronti da usare (array, interi, stringhe...)
$clans = $db->query('SELECT DISTINCT cid FROM team');
$num_clans = $db->query('SELECT count(DISTINCT cid) AS num FROM team');
$num_gironi = ceil($num_clans/4);
$i = 1;
foreach ($calns as $clan) //un array per ogni clan
{
$squadre = $db->query('SELECT tid FROM team WHERE cid='.$clan);
$squadre_clan[$i] = array();
foreach ($squadre as $squadra)
{
//inserisco la squadra nell'array del clan
$squadre_clan[$i][] = $squadra;
//metto in ordine casuale le squadre del clan
shuffle($squadre_clan[$i]);
}
$i++;
}
for ($i=0; $i<$num_gironi; $i++) //costruisco i gironi
{
$clan_selezionati = array();
$girone[$i] = array();
//conta quante squadre ho inserito nel girone
$j = 0;
while ($j < 4)
{
//sorteggio a caso un clan
$clan = rand(1,$num_clans);
//se non ho ancora preso questo clan nel girone in costruzione
if ( ! in_array($clan,$clan_selezionati) )
{
//se nel clan ci sono ancora quadre
if ( ! empty($squadre_clan[$clan]) )
{
//aggiungo la squadra al girone e la rimuovo dall'array del clan per non riprenderla
$girone[$i][] = array_pop($squadre_clan[$clan]);
//inserisco il clan tra i clan selezionati in questo girone
$clan_selezionati[] = $clan;
//è stata aggiunta una squadra al girone
$j++;
}
}
}
}
echo "<pre>";
print_r($girone);
echo "</pre>";