Moduletto con articoli consigliati in base ai tag

otto9due

Utente Attivo
22 Feb 2014
591
25
28
Dovrei creare un moduletto che a fine articolo prenda nel db gli articoli correlati in base ai tags ( inseriti nel db in un'unica cella come "prova, test, altrotag, tags, ecc" ) e confrontandoli con quelli dell'articolo visualizzato mi faccia una lista dei 5 articoli che trattano argomenti simili..
Qualcuno ha qualche idea su come realizzarlo?

Avevo pensato a creare un'array dai dati estrapolati dalla cella e poi fare un ciclo con like, ma ancora non ho chiaro il come realizzarlo.

Grazie in anticipo per eventuali risposte.

P.S. girando su internet ho trovato questo script ma nn l'ho capito benissimo..

PHP:
$query_parts = array();
foreach ($array_name as $val) {
// Cosa fa la funzione mysql_real_escape_string()?
    $query_parts[] = "'%".mysql_real_escape_string($val)."%'";
}
// qui non ho capito la parte OR url LIKE
$string = implode(' OR url LIKE ', $query_parts);

// qui non ho capito {$string} le parentesi graffe
$tank = "SELECT url FROM `PHP`.`db` WHERE url LIKE {$string}";
 
Ultima modifica:
Sono riuscito nell'intento, unica cosa che non riesco a capire è il perchè non mi esclude l'articolo stesso dove questa lista è contenuta, nel senso se il mio articolo è "ciao prova" con id 1 ed io facio una query esattamente come questa:

PHP:
'SELECT COUNT(*) FROM blog WHERE keywords LIKE "%prova key%" OR keywords LIKE "%prettt%" OR keywords LIKE "%prova%" OR keywords LIKE "%ecompilat%" OR keywords LIKE "%volipianss%" AND pub = 1 AND id <> "24"'

Dovrebbe teoricamente trovare tutti gli articoli che contengono una delle keywords indicate che abbiano pub = 1 e id diverso da 24.. Giusto ?
Ho provato anche con != anziché <> ma nulla, la query funziona tranne che nell'ultima parte che dovrebbe servirmi a non includere nella lista l'articolo stesso in cui la lista si trova.


Ho provato anche a togliere gli apici al 24 facendolo diventare di fatto un numero ma nulla..
 
Forse ho risolto in questo modo, ma non ho capito il perchè.. Qualcuno me lo spiega?
Aggiungendo delle parentesi tonde dopo il where, che contenessero tutti gli OR. A cosa servono?
PHP:
'SELECT COUNT(*) FROM blog WHERE (keywords LIKE "%prova key%" OR keywords LIKE "%prettt%" OR keywords LIKE "%prova%" OR keywords LIKE "%ecompilat%" OR keywords LIKE "%volipianss%") AND pub = 1 AND id <> "24"'
 
Ciao, non ne sono sicuro al 100% ma penso che sia perché diventa una condizione se aggiungi le tonde.
 
Però in questo momento sono tutte delle condizioni nel senso anche AND ... AND ... è una condizione.. , avevo pensato ad una specie di formula, che quello che sta in parentesi dev'essere verificato prima, bhoo..
 
le parentesi nelle query funzionano come le parentesi nelle espressioni, quello che sta fra parentesi viene valutato prima e ritornato come un unico risultato. puoi anche inserire parentesi dentro le parentesi per raggruppare ulteriormente.
nella tua prima query soltanto l'ultimo OR teneva conto del AND che c'è dopo mentre mettendo gli OR fra parentesi tutti tengono conto del AND perché quello fra parentesi viene ritornato come un unico risultato.
 
Diciamo che grazie a questo esempio, che comunque dovró ancora approfondire e per cui colgo l'occasione per ringraziarvi per i chiarimenti, ho conosciuto più a fondo anche le sub query. Ho visto e testato parecchie tipologie diverse e devo dire che sono molto utili ed in tanti casi un'ottima soluzione per ridurre anche di molto il codice.
Quindi ricapitolando: nei casi in cui bisogna aggiungere più OR e più AND ed altri nella stessa query, conviene suddividerli in parentesi? Mi confermate inoltre che come nelle espressioni queste verranno valutate prima dei dati posti al di fuori delle parentesi stesse.


Saluti.
G.G.
 
quando hai più opzioni per una sola variabile conviene metterle fra parentesi così verranno valutate come una sola
 
per semplificare al massimo ogni variabile della query deve risultare true perché la query riporti un risultato, quando ci sono una serie do OR oppure una combinazione di valori che possono avere stati diversi (es a=1 AND b=2 OR a=3 AND b=4) allora si mettono fra parentesi in modo da togliere gli eventuali false dal flusso della query. quindi nel caso dell'esempio di prima si dovrebbe scrivere
Codice:
(a=1 AND b=2) OR (a=3 AND b=4)
a sua volta questo può essere fra parentesi se nella query ci sono altre variabili quindi
Codice:
( (a=1 AND b=2) OR (a=3 AND b=4) ) AND c=5
in questo modo vengono valutati a e b e ritornati come un unico true o false e poi viene valutato c.
anche una serie di OR sulla stessa variabile andrebbero fra parentesi perché così tornano un unico true o false com'è giusto che sia.
spero di essere stato chiaro.

saluti
 
Chiarissimo grazie, sopratutto per questo ultimo esempio che è servito a rendere tutto più lineare con esempi caso per caso.. Come sempre grazie a tutti i partecipanti :)


Saluti.
G.G.
 
Ultima modifica:

Discussioni simili