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

    Aiuto per Selezionare dal Database

    Ciao a Tutti.
    Ho due Tabelle:
    - UTENTI (con chiave primaria ID, NUMRISPOSTE)
    - RISPOSTE (con TEMPO - formato time - e UTENTE_ID)

    Naturalmente UTENTE_ID coincide con la chiave primaria di UTENTI.
    In Questo modo io ho un elenco di risposte nel Forum con DATA E TEMPO ed un ID che fa riferimento all'UTENTE.

    Io Adesso Vorrei Stilare una Classifica di Risposte, con i primi 15 che hanno effettuato più risposte. E sin qui non c'è problema, mi occorrerebbe solo la Tab. Utenti.

    Il Problema è che io ho bisogno di un'elenco dei primi 15 classificati ANNUALMENTE. Cioè dovrei conteggiare annualmente il num di risposte inserite.

    HO BISOGNO DI QUALCHE AIUTO DI TIPO SPECIALMENTE MATEMATICO!
    Perchè facendo Rielaborare spesso tutte le righe di RISPOSTE, il sistema impiega troppo tempo. Ho bisogno di una sol. matematica più pratica.

    GRAZIE 1000.

  2. #2
    non sei stato troppo chiaro nell'esposizione del problema, in particolare quando parli di
    >HO BISOGNO DI QUALCHE AIUTO DI TIPO SPECIALMENTE MATEMATICO!


    secondo me, se ho intuito quello che vuoi, ti basta una query tipo

    select * from UTENTI
    Order by NUMRISPOSTE desc
    Limit 15


    se non è questo quello che ti serve, spiegati meglio.

  3. #3
    Grazie x aver risposto, anzitutto!

    Allora, quello che mi dici tu non basta, perchè io così avrei l'elenco dei primi 15 utenti con più risposte.

    Io ho bisogno dell'elenco dei primi 15 utenti con più risposte NELL'ANNO CORRENTE!

    Bisogna agire quindi sulla tabella RISPOSTE.

    IN PRATICA DEVO VERIFICARE:
    - Quante Righe ci sono in "RISPOSTE" in cui UTENTE_ID è 1, poi 2, poi 3 ecc... (da 1, sino al numero di Righe presenti in "UTENTI") SOLO QUANDO TEMPO>2005.

    Di questi visualizzare i primi 15.

    Forse può aiutarmi GROU BY, è nei nuovi codici dell'sql. Magari ci dai un'occhiata tu? Io ho qualke perplessità ankora.

    GRAZIE.

  4. #4
    Ciao, so come fare quello che richiedi in Oracle, ho provato a tradurre la sintassi per MySQL, spero che sia corretta...
    Praticamente "estrai" dalla data soltanto l'anno mediante la funzione date_format che trasforma una data in una stringa. Quindi confronti il dato estratto con l'anno che desideri.

    codice:
    select * from UTENTI U,RISPOSTE R
    where U.UTENTE_ID = R.UTENTE_ID
    and date_format(R.TEMPO, "%Y") > '2005'
    order by NUMRISPOSTE desc
    limit 15
    Se non vuoi modificare il codice ad ogni capodanno, puoi addirittura usare il parametro now() per avere la data corrente:

    codice:
    select * from UTENTI U,RISPOSTE R
    where U.UTENTE_ID = R.UTENTE_ID
    and date_format(R.TEMPO, "%Y") = date_format(now(), "%Y") 
    order by NUMRISPOSTE desc
    limit 15
    Ti ripeto, non ho esperienza con MySql, non so se quello che ho scritto è corretto... spero comunque che possa darti qualche indicazione su come procedere...

    Ciao

  5. #5
    Ti ringrazio, ma mi sa che dalla soluzione siamo lontani.

  6. #6
    Originariamente inviato da PiccoloPalazzi
    Ti ringrazio, ma mi sa che dalla soluzione siamo lontani.
    premesso che senza sapere qualche minimo dettaglio sulla struttura del db non è semplice, ci provo comunque:

    SELECT DISTINCT NUMRISPOSTE, COUNT(NUMRISPOSTE) Tot_Risposte from RISPOSTE
    GROUP BY NUMRISPOSTE
    ORDER BY Tot_Risposte DESC
    LIMIT15

    Per il filtro sulla data puoi usare la condizione WHERE che ha usato Sarachan e credo che è corretta, se non funzione devi vedere in base al formato data che hai nel db come modificare solo quel rigo.

    Vedi che il GROUP BY non è una cosa nuova...

  7. #7
    Credevo di semplificare, invece vi ho complicato solo la vita. Vi Ringrazio ancora, x cominciare.
    Vi posto la struttura SQL:

    codice:
    CREATE TABLE `nuke_splattforum_posts` (
      `post_id` int(10) NOT NULL auto_increment,
      `image` varchar(100) default NULL,
      `topic_id` int(10) NOT NULL default '0',
      `forum_id` int(10) NOT NULL default '0',
      `poster_id` int(10) default NULL,
      `post_text` text,
      `post_time` varchar(20) default NULL,
      `poster_ip` varchar(16) default NULL,
      PRIMARY KEY  (`post_id`),
      KEY `post_id` (`post_id`),
      KEY `topic_id` (`topic_id`),
      KEY `forum_id` (`forum_id`),
      KEY `poster_id` (`poster_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=6130 ;
    
    
    CREATE TABLE `nuke_users` (
      `user_id` int(11) NOT NULL auto_increment,
      `name` varchar(60) NOT NULL default '',
      `username` varchar(25) NOT NULL default '',
      `user_email` varchar(255) NOT NULL default '',
      `femail` varchar(255) NOT NULL default '',
      `user_website` varchar(255) NOT NULL default '',
      `user_avatar` varchar(30) default NULL,
      `user_regdate` varchar(20) NOT NULL default '',
      `user_icq` varchar(15) default NULL,
      `user_occ` varchar(100) default NULL,
      `user_from` varchar(100) default NULL,
      `user_interests` varchar(150) default NULL,
      `user_sig` varchar(255) default NULL,
      `user_viewemail` tinyint(2) default NULL,
      `user_theme` int(3) default NULL,
      `user_aim` varchar(18) default NULL,
      `user_yim` varchar(25) default NULL,
      `user_msnm` varchar(25) default NULL,
      `user_password` varchar(40) NOT NULL default '',
      `storynum` tinyint(4) NOT NULL default '10',
      `umode` varchar(10) NOT NULL default '',
      `uorder` tinyint(1) NOT NULL default '0',
      `thold` tinyint(1) NOT NULL default '0',
      `noscore` tinyint(1) NOT NULL default '0',
      `bio` tinytext NOT NULL,
      `ublockon` tinyint(1) NOT NULL default '0',
      `ublock` tinytext NOT NULL,
      `theme` varchar(255) NOT NULL default '',
      `commentmax` int(11) NOT NULL default '4096',
      `counter` int(11) NOT NULL default '0',
      `newsletter` int(1) NOT NULL default '1',
      `user_posts` int(10) NOT NULL default '0',
      `user_attachsig` int(2) NOT NULL default '0',
      `user_rank` int(10) NOT NULL default '0',
      `user_level` int(10) NOT NULL default '1',
      `broadcast` tinyint(1) NOT NULL default '1',
      `popmeson` tinyint(1) NOT NULL default '0',
      `user_active` tinyint(1) default '1',
      `user_session_time` int(11) NOT NULL default '0',
      `user_session_page` smallint(5) NOT NULL default '0',
      `user_lastvisit` int(11) NOT NULL default '0',
      `user_timezone` tinyint(4) NOT NULL default '0',
      `user_style` tinyint(4) default '0',
      `user_lang` varchar(255) NOT NULL default 'italian',
      `user_dateformat` varchar(14) NOT NULL default 'D M d, Y g:i a',
      `user_new_privmsg` smallint(5) unsigned NOT NULL default '0',
      `user_unread_privmsg` smallint(5) unsigned NOT NULL default '0',
      `user_last_privmsg` int(11) NOT NULL default '0',
      `user_emailtime` int(11) NOT NULL default '0',
      `user_allowhtml` tinyint(1) default '1',
      `user_allowbbcode` tinyint(1) default '1',
      `user_allowsmile` tinyint(1) default '1',
      `user_allowavatar` tinyint(1) NOT NULL default '1',
      `user_allow_pm` tinyint(1) NOT NULL default '1',
      `user_allow_viewonline` tinyint(1) NOT NULL default '1',
      `user_notify` tinyint(1) NOT NULL default '0',
      `user_notify_pm` tinyint(1) NOT NULL default '1',
      `user_popup_pm` tinyint(1) NOT NULL default '0',
      `user_avatar_type` tinyint(4) NOT NULL default '3',
      `user_sig_bbcode_uid` varchar(10) default NULL,
      `user_actkey` varchar(32) default NULL,
      `user_newpasswd` varchar(32) default NULL,
      `points` int(10) default '0',
      `last_ip` varchar(15) NOT NULL default '0',
      `karma` tinyint(1) default '0',
      `user_group_cp` int(11) NOT NULL default '2',
      `user_group_list_cp` varchar(100) NOT NULL default '2',
      `user_active_cp` enum('YES','NO') NOT NULL default 'YES',
      PRIMARY KEY  (`user_id`),
      KEY `user_id` (`user_id`),
      KEY `username` (`username`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1084 ;
    IN "nuke_splattforum_posts", sono importanti:
    - poster_id (questo campo contiene l'id dell'autore del post. naturalmente lo prende da "user_id" di nuke_users)
    - post_time (questo contiene la data del post, in questo modo: "2006-07-02 11:04")

    IN "nuke_users", sono importanti:
    - "user_id" (chiave primaria, contiene l'id dell'utente)
    - "username" (il nick dell'utente)

    DI COSA HO BISOGNO? UN'ELENCO DEGLI UTENTI CHE NELL'ANNO CORRENTE HANNO SCRITTO PIU' POST!

    Spero sia Chiaro ora.

    Grazie ancora!

  8. #8
    Ciao,
    ora vado un attimo di fretta quindi ti posto un pezzo di codice ma verifica tu se funziona...


    SELECT DISTINCT `poster_id` , COUNT( `poster_id` ) TOT, nuke_users.*
    FROM `nuke_splattforum_posts`
    LEFT JOIN nuke_users ON poster_id = user_id
    GROUP BY `poster_id`
    ORDER BY TOT DESC
    LIMIT 30

    dimmi se funziona poi mettiamo la condizione sulla data ma quella del post precedente dovrebbe andare bene.

  9. #9
    Sembra che Funzioni, Grazie x la Pazienza.
    Non riesco ad applicare il WHERE però. il Campo della data è di tipo TEXT, non TIME o DATE.

    Forse con un:
    WHERE `post_time` REGEXP ...
    si riesce, ma comunque non sto riuscendo ad applicarlo. tu ne sei più di me...

    GRAZIE 1000 X TUTTO.

  10. #10
    prova con:

    post_time

    SELECT DISTINCT `poster_id` , COUNT( `poster_id` ) TOT, nuke_users.*
    FROM `nuke_splattforum_posts`
    LEFT JOIN nuke_users ON poster_id = user_id
    WHERE SUBSTRING(post_time,1,4) = '2006'
    GROUP BY `poster_id`
    ORDER BY TOT DESC
    LIMIT 30

    se non esce nulla dalla query, prova a mettere come parametri SUBSTRING(post_time,0,3), cmq dovrebbe funzionare come ho scritto.


    fammi sapere.


    scusa ma ora non posso provare....

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.