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

    [deForum] numero di risposte per topic inesatto

    indovinate un po'...ancora il mio forum! VVoVe:

    Codice PHP:
    SELECT t.id,t.oggetto,SUBSTRING(t.testo,1,100) AS ante_txt,t.userid,t.tdata,t.nvisite,t.chiuso,t.pin,t.poll,
    COUNT(p.id) AS numposts,p.topicid,
    u.nome,
    pp.userid AS idultimouser,pp.pdata AS dataultima,
    uu.nome AS ultimouser
    FROM 
    ".$tblprefix."topics AS t
    LEFT JOIN 
    ".$tblprefix."posts AS p ON p.topicid=t.id
    LEFT JOIN 
    ".$tblprefix."users AS u ON t.userid=u.id
    LEFT JOIN 
    ".$tblprefix."posts AS pp ON t.id=pp.topicid
    LEFT JOIN 
    ".$tblprefix."users AS uu ON pp.userid=uu.id
    WHERE t
    .stanzaid='$id' GROUP BY t.id
    ORDER BY t
    .pin DESCpp.pdata DESCpp.id DESCt.tdata DESC 
    Questa query, in caso ci sia un topic con 10 risposte, mi restituisce 100 come numero delle risposte. Il motivo l'ho capito, cioè che moltiplica il numero dei posts (numposts) per sè stesso, ma non so come risolvere.

    Ho provato anche usando HAVING p.topicid=t.id ma non cambia nulla; raggruppando per p.id mi restituisce 10 copie dello stesso topic (però con il numero di risposte esatto!); usando INNER o RIGHT al posto di LEFT (anche invertendo l'ordine dei campi joinati) non cambia nulla...

    Che dite, è meglio dedicare un campo nella tabella topics in cui memorizzare il numero di risposte (quindi una query in più ad ogni risposta)?? E in termini di prestazioni sarebbe meglio?

    Tnx come al solito.


    Ciaooooooo!!!!!!
    Originariamente inviato da kalamaro
    una volta avevate linkato la pagina di un software per eliminare i ciao! di debug dai post, ho provato nel mio negozio di fiducia a scaffale non lo hanno, vi ricordate il nome?

  2. #2
    codice:
    FROM ".$tblprefix."topics AS t 
    LEFT JOIN ".$tblprefix."posts AS p ON p.topicid=t.id 
    LEFT JOIN ".$tblprefix."users AS u ON t.userid=u.id 
    LEFT JOIN ".$tblprefix."posts AS pp ON t.id=pp.topicid 
    LEFT JOIN ".$tblprefix."users AS uu ON pp.userid=uu.id
    doppioni nelle tabelle

    p <-> pp
    u <-> uu

    a che ti servono?

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

  3. #3
    Uno per il totale dei posts per ogni topic, e l'altro per l'ultimo post del topic (da cui ricavo anche l'ultimo user che ha risposto).


    Ciaooo!!!
    Originariamente inviato da kalamaro
    una volta avevate linkato la pagina di un software per eliminare i ciao! di debug dai post, ho provato nel mio negozio di fiducia a scaffale non lo hanno, vi ricordate il nome?

  4. #4
    codice:
    FROM ".$tblprefix."topics AS t 
    LEFT JOIN ".$tblprefix."users AS u ON t.userid=u.id 
    LEFT JOIN ".$tblprefix."users AS uu ON pp.userid=uu.id 
    
    LEFT JOIN ".$tblprefix."posts AS p ON p.topicid=t.id 
    LEFT JOIN ".$tblprefix."posts AS pp ON t.id=pp.topicid 
    dove sarebbe la differenza tra le due righe evidenziate in grassetto????

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

  5. #5
    Ma porc!!! VVoVe:
    Ma lo sai che togliendo quei doppioni risolvo il problema??
    mmm, sì, lo sai!...

    Avevo fatto dei ragionamenti per districarmi nelle varie info che dovevo ricavare, e credo di aver lasciato quei doppioni durante qualche test... però mi piacevano e li ho lasciati!

    Ok, grazie mille!
    (visto, non ti ho fatto faticare più di tanto!)


    Ciaoooooo!!!!!!!!
    Originariamente inviato da kalamaro
    una volta avevate linkato la pagina di un software per eliminare i ciao! di debug dai post, ho provato nel mio negozio di fiducia a scaffale non lo hanno, vi ricordate il nome?

  6. #6
    Ehm, marcia indietro, non ho risolto!

    Non mi estrae l'user dell'ultima risposta, ma sempre il primo (non riesco a ordinare i posts relativi al topic in ordine decrescente)!


    Ciaoo!!
    Originariamente inviato da kalamaro
    una volta avevate linkato la pagina di un software per eliminare i ciao! di debug dai post, ho provato nel mio negozio di fiducia a scaffale non lo hanno, vi ricordate il nome?

  7. #7
    Arisalve, ariposto qui essendo l'argomento quasi uguale ai precedenti trattati.

    3 tabelle:
    codice:
    TABELLA "A":
    Aid  |  nome  |  ultimo_Bid
    codice:
    TABELLA "B":
    Bid  |  titolo  |  Aid
    codice:
    TABELLA "C":
    Cid  |  Aid  |  Bid
    Query:
    Codice PHP:
    SELECT a.Aida.nomea.ultimoBidb.titolob.AidCOUNT(c.Cid) AS numC
    FROM a
    LEFT JOIN b ON a
    .ultimo_Bid=b.id
    LEFT JOIN c ON b
    .Bid=c.Bid
    GROUP BY a
    .Aid 
    Risultato atteso:
    codice:
    a.Aid=1; a.nome=pippo; a.ultimoBid=3; b.titolo='Ciao'; b.Aid=1; numC=6
    Risultato ottenuto:
    codice:
    a.Aid=1; a.nome=pippo; a.ultimoBid=3; b.titolo='Ciao'; b.Aid=1; numC=42
    Cosa sbaglio?

    NB: Siccome ho semplificato la situazione che ho realmente, può darsi che non sia ben chiaro il tutto, in quel caso posto le effettive tabelle con effettiva query e risultato atteso/ottenuto.

    Grazie.


    Ciaoooooo!!!!!!!!!!!!!!!!!!!
    Originariamente inviato da kalamaro
    una volta avevate linkato la pagina di un software per eliminare i ciao! di debug dai post, ho provato nel mio negozio di fiducia a scaffale non lo hanno, vi ricordate il nome?

  8. #8
    Nessuno?


    Ciao!
    Originariamente inviato da kalamaro
    una volta avevate linkato la pagina di un software per eliminare i ciao! di debug dai post, ho provato nel mio negozio di fiducia a scaffale non lo hanno, vi ricordate il nome?

  9. #9
    Originariamente inviato da debug
    Ehm, marcia indietro, non ho risolto!

    Non mi estrae l'user dell'ultima risposta, ma sempre il primo (non riesco a ordinare i posts relativi al topic in ordine decrescente)!


    Ciaoo!!
    il raggruppamento prende i dati del primo record che soddisfa la condizione. Primo si intende in ordine fisico dentro la tabella.

    Se hai una versione aggiornata di mysql puoi tentare la query annidata che ti estragga l'id piu' recente da usare per pescare il record, oppure fai due queries che ti garantiscono la compatibilita'. Tanto sempre due queries sono.


    per la query vedo male la relazione che fai. se la tabella "c" e' quella che unisce "a" e "b" queste due devono riferirsi solo a "c" e non tra di loro.

    Codice PHP:
    SELECT *, COUNT(c.Cid) AS numC 
    FROM c 
    LEFT JOIN b ON b
    .Bid c.Bid 
    LEFT JOIN a ON a
    .Aid c.Aid 
    GROUP BY a
    .Aid 
    anche se mi sfugge il significato di un raggruppamento per "Aid" che essendo un id si presume univoco.

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

  10. #10
    No aspetta, non è chiara la situazione (forse non mi sono spiegato bene).
    Tutta il resto del topic è risolto, visto che ho dedicato due campi nella tabella per lo scopo.
    Ora la questione è un'altra, pur essendo sempre lo stesso concetto (è per questo che non ho aperto un altro topic).

    Posto l'intera query:

    Codice PHP:
    SELECT s.id,s.nome,s.descrizione,s.cat,s.ntopics,s.nposts,
    t.oggetto AS titolotopic,t.tdata,t.last_userid AS last_userid,t.userid AS userid,t.id AS topic_id,
    p.topicid,p.pdata,COUNT(pp.id) AS numpost_topic,
    u.nome AS last_nomeuser,uu.nome AS nomeuser,
    c.nome AS nomecat,c.ordine AS ordinecat
    FROM stanze 
    AS s
    LEFT JOIN topics 
    AS t ON t.stanzaid=s.id
    LEFT JOIN posts 
    AS p ON p.stanzaid=s.id
    LEFT JOIN posts 
    AS pp ON pp.topicid=t.id
    LEFT JOIN users 
    AS u ON u.id=p.userid
    LEFT JOIN users 
    AS uu ON uu.id=t.userid
    LEFT JOIN categorie 
    AS c ON s.cat=c.id
    GROUP BY s
    .id ORDER BY ordinecat ASC,s.ordine ASC,p.pdata DESC,pp.pdata DESC,t.tdata DESC 
    Come vedi non c'è una tabella che "unisce" altre due, ma sono 3 differenti tabelle, posts, topics e stanze. Praticamente ciò che si ottiene è che le risposte all'ultimo topic anzichè 6 sono 42.

    Grazie.


    Ciaooo!!!!!!!!!!
    Originariamente inviato da kalamaro
    una volta avevate linkato la pagina di un software per eliminare i ciao! di debug dai post, ho provato nel mio negozio di fiducia a scaffale non lo hanno, vi ricordate il nome?

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.