Quesito più difficile di quanto pensassi dunque più interessante.
Prova questo (non testato).
Codice PHP:
<?php
$forn_accettati = array("pippo");
$numero_elementi = count($forn_accettati);
// l'articolo deve avere tutti i fornitori della lista - quindi una INNER JOIN per fornitore funziona da AND => fornitore 1 and fornitore 2 etc...
$innerClause = "";
foreach($forn_accettati as $chiave => $valore)
{
$innerClause .= " INNER JOIN tab_prodotti tp$chiave ON (op.id_prodotto = tp$chiave.id_prodotto) and tp$chiave.fornitore = '$valore' ";
}
// il numero dei fornitori per l'articolo deve essere pari al numero di fornitori nella lista
$whereClause = " WHERE EXISTS(SELECT COUNT(*) FROM tab_prodotti tpx WHERE op.id_prodotto = tpx.id_prodotto HAVING COUNT(*) = $numero_elementi)";
// con la prima clausola siamo sicuri di prendere un articolo "aperto" sù tutti i fornitori
// con la seconda scartiamo gli articoli che hanno più fornitori del numero di fornitori della lista
$query = "SELECT id_ordini from tab_ordini to INNER JOIN ordini_prodotti op ON(to.ordine_id = op.ordine_id)"
. $innerClause . $whereClause;