Vediamo un po'.
Sia $id l'id dell'articolo che stai visualizzando, allora la query
codice:
SELECT id_tag FROM correlazioni WHERE id_art = $id
ti restituisce la lista degli id delle tag associate all'articolo.
Ora, sfruttando le select innestate, estendiamo questa query
codice:
SELECT id_art FROM correlazioni WHERE id_art <> $id AND id_tag IN (
SELECT id_tag FROM correlazioni WHERE id_art = $id
) ORDER BY id_art
In questo modo dovresti ottenere la lista di tutti gli id degli articoli che hanno almeno un tag comune all'articolo $id. Per coerenza escludiamo dai risultati l'articolo $id.
Ultimo miglioramento. Sfruttando funzioni di aggregazione di SQL conteremo quante volte si ripete una relazione
codice:
SELECT id_art, COUNT(id_art) AS relazioni FROM correlazioni WHERE id_art <> $id AND id_tag IN (
SELECT id_tag FROM correlazioni WHERE id_art = $id
) GROUP BY id_art ORDER BY relazioni DESC
Gruppando sull'id_art possiamo contare quante volte uno stesso id_art è ripetuto.
Immaginando che nella tabella correlazioni coppie <id_art, id_tag> si ripetano una sola volta, il numero di ripetizioni equivale al numero di tags comuni.
Ordinando per numero di relazioni discendente ottieni quindi gli articoli correlati secondo il grado di rilevanza.
Spero sia tutto chiaro
Buon weekend