Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    Forum: SELECT di messaggi in base alla data dell'ultima risposta

    Ciao, ho questo quesito per voi tutti davvero niente male ;-)

    Gestisco un Forum, strutturato in tre tabelle MySQL: forum, forum_messaggi, forum_risposte.
    Orbene, nelle pagine lato utente visualizzo il titolo di tutti i messaggi (con accanto il numero delle risposte ricevute) che se cliccati mostrano al messaggio e a tutte le risposte associate.
    Fin qui tutto bene, ma io vorrei visualizzare in questa pagina solo quei messaggi che hanno ricevuto risposte negli ultimi 60gg. Cioè se un messaggio non ha avuto risposte da + di due mesi, non deve essere visualizzato.

    Volevo far questo tramite una SELECT MySQL, ma non riesco ad arrivare alla formula giusta.
    Qualcuno di voi sa aiutarmi?
    Ecco le caratteristiche delle tabelle:

    forum_messaggi
    Campo Tipo Null Predefinito
    id int(5) No
    id_forum int(5) No 0
    titolo varchar(255) No
    testo text No
    nome varchar(100) Si NULL
    data int(10) No 0

    forum_risposte
    Campo Tipo Null Predefinito
    id int(5) No
    id_messaggio int(5) No 0
    id_forum int(5) No 0
    testo text No
    nome varchar(100) Si NULL
    data int(10) No 0

    Fatemi sapere, HELP!!!

  2. #2
    Moderatore di Server Apache L'avatar di marketto
    Registrato dal
    Sep 2001
    Messaggi
    5,858
    codice:
    SELECT forum_messaggi.id, forum_messaggi.titolo, forum_risposte.* FROM forum_messaggi
    INNER JOIN forum_risposte ON forum_risposte.id_messaggi = forum_messaggi.id
    WHERE forum_risposte.data > UNIX_TIMESTAMP(CURDATE() - INTERVAL 2 MONTH);
    un suggerimento: usa il campo DATETIME x le date
    think simple think ringo

  3. #3

    Quasi fatta...

    Grazie Marketto, ti richiamo in appello (...e anche tutti gli altri...) per concludere in bellezza!

    SELECT DISTINCT forum_messaggi.id AS id, forum_messaggi.id_forum, forum_messaggi.titolo, forum_messaggi.nome AS nome, forum_messaggi.data AS data , forum_risposte.id_messaggio FROM forum_messaggi INNER JOIN forum_risposte ON forum_risposte.id_messaggio = forum_messaggi.id WHERE forum_messaggi.id_forum='$result[id]' AND forum_risposte.data > UNIX_TIMESTAMP(CURDATE() - INTERVAL 3 MONTH) OR forum_messaggi.data > '$iniziomex' ORDER BY forum_messaggi.data DESC

    Questo codice fa parte di quello che ho sistemato nella pagina e funziona. Ho dovuto rivederlo per adattarlo il più possibile alla mia esigenza.

    La parte in rosso non funziona (ripeto, il resto va benissimo e tutte le variabili sono esistenti e funzionanti compresa la $iniziomex), cioè la SELECT ha effetto solo se si verifica la prima ipotesi, non la seconda. PERCHE'!!!!???
    Dovè che sbaglio?

    Sapete aiutarmi?

  4. #4
    metti tra parentesi la clausula OR.....
    codice:
    WHERE forum_messaggi.id_forum='$result[id]' 
    AND 
    (forum_risposte.data > UNIX_TIMESTAMP(CURDATE() - INTERVAL 3 MONTH) 
    OR forum_messaggi.data > '$iniziomex')
    senza le parentesi rimarrebbe....

    where (prima condizione AND seconda) OR terza.... mentre tu vorresti:
    where prima condizione AND (seconda OR terza)


    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  5. #5
    Grazie Piero.mac per il tuo intervento, però putroppo continua a non funzionare!!!
    Cioè, mettendo tra partentesi la seconda e terza condizione separate da OR, mi visualizza sempre solo le select in cui la seconda condizione è vera e mai dove lo è la terza. PERCHE?!?!?!?!?

    Questo il codice, con le parentesi aggiunte:

    SELECT DISTINCT forum_messaggi.id AS id, forum_messaggi.id_forum, forum_messaggi.titolo, forum_messaggi.nome AS nome, forum_messaggi.data AS data , forum_risposte.id_messaggio FROM forum_messaggi INNER JOIN forum_risposte ON forum_risposte.id_messaggio = forum_messaggi.id WHERE forum_messaggi.id_forum='$result[id]' AND (forum_risposte.data > UNIX_TIMESTAMP(CURDATE() - INTERVAL 3 MONTH) OR forum_messaggi.data > '$iniziomex') ORDER BY forum_messaggi.data DESC

    Ipotesi: può essere che campi con lo stesso nome all'interno di tabelle differenti in una SLECT con JOIN creino problemi?

    Fatemi sapere... mi sento ad un millimetro dalla soluzione!!!

  6. #6
    Forse ho capito, è proprio un errore di logica...

    Ditemi se è così: la INNER JOIN unisce le due tabelle tramite i campi che gli comunichiamo dopo l'ON. Se il campo della tabella unita è vuoto, l'inner join non funziona per cui non seleziona niente solo dalla prima tabella.
    Cioè, mi spiego meglio, questo tipo di SELECT seleziona quei record dove c'è una corrispondenza tra i campi uniti nella JOIN. Dove non c'è tale corrispondenza, la selezione non avviene, giusto???

    Per cui, come faccio (per tornare al problema iniziale) ad avere una SELECT che mi selezioni solo quei messaggi che hanno ricevuto risposte negli ultimi 60gg (ma che come data del messaggio possono avere anche 678 anni), e anche quelli che non hanno ricevuto mai risposte ma sono presenti da meno di 60gg?

    E' un pò troppo contorto?!? :master: :master: :master:

  7. #7
    No, perche' sono identificati da tabella.campo

    Non so che hai nelle tabelle. Per esempio il formato di forum_messaggi.data ....

    Fai query di debug, cioe' togli tutte le codizione WHERE e prova una condizione alla volta per vedere quello che ricevi. E' il sistema migliore.

    WHERE forum_messaggi.id_forum = '$result[id]'
    WHERE forum_risposte.data > UNIX_TIMESTAMP(CURDATE() - INTERVAL 3 MONTH
    WHERE forum_messaggi.data > '$iniziomex'

    poi passi a due ..ecc.




    Ps. risposto al post precedente, tuo penultimo

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  8. #8
    Ciao Pmac dai un occhio alla risposta che ho inserito due secondi prima di te, poichè credo che tu mi stessi rispondendo a quella precedente. Hai guardato?
    Credi che effettivamente un errore di logica???
    pendo dalle tue labbra...

  9. #9
    Cioè, per intenderci: la INNER JOIN funziona solo là dove trova corrispondenza tra i due campi messi in relazione? Oppure unisce a prescindere dal contenuto dei campi???

  10. #10
    Originariamente inviato da cemsal
    Ciao Pmac dai un occhio alla risposta che ho inserito due secondi prima di te, poichè credo che tu mi stessi rispondendo a quella precedente. Hai guardato?
    Credi che effettivamente un errore di logica???
    pendo dalle tue labbra...
    leggo e rileggo... mi sembra di capire, poi invece no... domanda:

    in pratica quello che da te non si verifica mai e' la seguente condizione?

    WHERE forum_messaggi.id_forum = '$result[id]' AND forum_messaggi.data > '$iniziomex'

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.