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

    [mysql] estrarre record

    Vi chiedo aiuto, a quest'ora non riesco a ragionare, devo realizzare una query per prendere i valori da 2 tabelle diverse, che hanno un id in comune per la relazione. Devo prendere tutti i record della prima tabella, e tutti quelli della seconda tabella il cui campo ha un dato diverso da un valore.
    Se faccio una select con le join mettendo nella condizione campo<>'valore' non mi prende tutti i valori della prima tabella, ma tutti quelli la cui relazione ha quel campo diverso dal valore. Dovrei anche evitare di far uscire il record della prima tabella quando tutti i record della seconda tabella ha il dato diverso da quel valore, ma credo che tale cosa non si possa fare direttamente da mysql.

  2. #2
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120

    Re: [mysql] estrarre record

    Originariamente inviato da jeck
    a quest'ora non riesco a ragionare
    e nemmeno a esprimerti in modo comprensibile, si direbbe

  3. #3

    Re: Re: [mysql] estrarre record

    Originariamente inviato da luca200
    e nemmeno a esprimerti in modo comprensibile, si direbbe
    Non mi sono spiegato?

  4. #4
    Posta la struttra delle tabelle e indica cosa vorresti estrarre.

  5. #5
    Scusa se rispondo ora, ma sono stato fuori in questi giorni.
    La struttura della prima tabella è questa
    codice:
    CREATE TABLE `my_tab` (
      `eid` mediumint(8) unsigned NOT NULL auto_increment,
      `nome` varchar(255) NOT NULL,
      `mail_e` varchar(255) NOT NULL,
      `tipo` varchar(255) NOT NULL,
      `icona` varchar(50) NOT NULL,
      `data_dal` date default NULL,
      `data_al` date default NULL,
      `ev_dal` date default NULL,
      `ev_al` date default NULL,
      `coming` longtext NOT NULL,
      `home` varchar(255) NOT NULL,
      `enable` tinyint(3) unsigned NOT NULL,
      PRIMARY KEY  (`eid`),
      FULLTEXT KEY `nome_2` (`nome`,`home`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1;
    e la struttura della seconda tabella è questa

    codice:
    CREATE TABLE `my_cat` (
      `ceid` mediumint(5) unsigned NOT NULL auto_increment,
      `nome` varchar(100) NOT NULL,
      `eid` mediumint(8) unsigned NOT NULL,
      `colore` varchar(7) NOT NULL,
      `private` tinyint(3) unsigned NOT NULL default '0',
      `d_ini` date NOT NULL,
      `d_fine` date NOT NULL,
      `enable` tinyint(4) NOT NULL default '1',
      `desc` varchar(255) NOT NULL,
      `logo` varchar(100) NOT NULL,
      `genere` varchar(100) NOT NULL,
      PRIMARY KEY  (`ceid`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1;
    i campi che sono in relazione si chiamano eid in tutte e due le tabelle, un record della prima tabella può avere in relazione più record della seconda.

    Io vorrei estrarre tutti i valori della prima tabella e tutti i valori della seconda tabella, i cui campi ev_dal,ev_al per la prima e d_ini,d_fine per la seconda sono compresi tra una precisa data e siano diversi da zero. io ho fatto una query in questo modo, ma non funziona a dovere, in pratica mi tira fuori dei valori che non sono compresi in quella precisa data

    codice:
    SELECT e.eid AS eid, c.eid AS eid_c FROM my_tab AS e,my_cat AS c WHERE e.enable=1 AND e.tipo='Pubblico' AND c.enable=1 AND (((e.ev_dal<='2008-12-06' AND '2008-12-06'<=e.ev_al) OR (c.d_ini<='2008-12-06' OR '2008-12-06'<=c.d_fine)) AND c.d_ini>'0000-00-00' AND e.ev_dal>'0000-00-00') HAVING eid=eid_c ORDER BY c.d_ini,e.ev_dal DESC

  6. #6
    Originariamente inviato da jeck
    Scusa se rispondo ora, ma sono stato fuori in questi giorni.
    La struttura della prima tabella è questa
    codice:
    CREATE TABLE `my_tab` (
      `eid` mediumint(8) unsigned NOT NULL auto_increment,
      `nome` varchar(255) NOT NULL,
      `mail_e` varchar(255) NOT NULL,
      `tipo` varchar(255) NOT NULL,
      `icona` varchar(50) NOT NULL,
      `data_dal` date default NULL,
      `data_al` date default NULL,
      `ev_dal` date default NULL,
      `ev_al` date default NULL,
      `coming` longtext NOT NULL,
      `home` varchar(255) NOT NULL,
      `enable` tinyint(3) unsigned NOT NULL,
      PRIMARY KEY  (`eid`),
      FULLTEXT KEY `nome_2` (`nome`,`home`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1;
    e la struttura della seconda tabella è questa

    codice:
    CREATE TABLE `my_cat` (
      `ceid` mediumint(5) unsigned NOT NULL auto_increment,
      `nome` varchar(100) NOT NULL,
      `eid` mediumint(8) unsigned NOT NULL,
      `colore` varchar(7) NOT NULL,
      `private` tinyint(3) unsigned NOT NULL default '0',
      `d_ini` date NOT NULL,
      `d_fine` date NOT NULL,
      `enable` tinyint(4) NOT NULL default '1',
      `desc` varchar(255) NOT NULL,
      `logo` varchar(100) NOT NULL,
      `genere` varchar(100) NOT NULL,
      PRIMARY KEY  (`ceid`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1;
    i campi che sono in relazione si chiamano eid in tutte e due le tabelle, un record della prima tabella può avere in relazione più record della seconda.

    Io vorrei estrarre tutti i valori della prima tabella e tutti i valori della seconda tabella, i cui campi ev_dal,ev_al per la prima e d_ini,d_fine per la seconda sono compresi tra una precisa data e siano diversi da zero. io ho fatto una query in questo modo, ma non funziona a dovere, in pratica mi tira fuori dei valori che non sono compresi in quella precisa data

    codice:
    SELECT e.eid AS eid, c.eid AS eid_c FROM my_tab AS e,my_cat AS c WHERE e.enable=1 AND e.tipo='Pubblico' AND c.enable=1 AND (((e.ev_dal<='2008-12-06' AND '2008-12-06'<=e.ev_al) OR (c.d_ini<='2008-12-06' OR '2008-12-06'<=c.d_fine)) AND c.d_ini>'0000-00-00' AND e.ev_dal>'0000-00-00') HAVING eid=eid_c ORDER BY c.d_ini,e.ev_dal DESC
    Dovresti strutturarla in maniera diversa dal mio punto di vista.. innanzitutto dovresti tenere nella tabella un solo campo data al posto di avere 'dal' 'al' poi l'intervallo lo calcoli, ti eviti molti problemi. Poi struttura una query di questo tipo:

    'SELECT my_tab.*, my_cat.* FROM my_tab INNER JOIN my_cat ON my_tab.eid=my_cat.eid WHERE data BETWEEN '.$datamin.' AND '.$datamax;

    Prende tutti i valori della prima e della seconda tabella compresi tra $datamin e $datamax, valori che puoi recuperare da un semplice form di ricerca...o se no togli $datami e $datamax e al loro posto metti la data che ti interessa.

  7. #7
    Lo so che andrebbe strutturato diversamente il db, ma questa è una modifica che vuole il cliente, all'inizio tutte le ricerche si basavano sulla tabella principale, e quindi con una query si riusciva a prendere tranquillamente tutti i dati senza problemi. Non potrei neanche tenere le date come dici te, perchè le due date potrebbero essere distanti qualche giorno, e se alla query passo una data centrale quel record si deve visualizzare, quindi devo sempre avere 2 date, inizio e fine.
    In pratica la prima tabella contiene tutti i dati per creare una pagina del sito, e la seconda tabella contiene la lista di tutte le categorie di quella pagina creata (le pagine sono eventi sportivi). Ora invece tutte le ricerche si basano sulla seconda tabella, ma tutti i dati da prelevare si trovano nella prima, e per avere una retrocompatibilità con i dati già immessi non posso fare molte modifiche, ora il cliente vuole che alle categorie di quella pagina creata siano impostate delle date,perchè devono poter essere listate separatamente. Non posso fare modifiche al db anche perchè molte altre sezioni del sito prendono i dati da quelle due tabelle, e siccome il budget è molto basso non posso modificare molte cose.
    Provo la query che hai detto, ma non so se va, ricordo di aver provato con le INNER JOIN e non mi restituiva tutti i dati previsti.

  8. #8
    Originariamente inviato da jeck
    Lo so che andrebbe strutturato diversamente il db, ma questa è una modifica che vuole il cliente, all'inizio tutte le ricerche si basavano sulla tabella principale, e quindi con una query si riusciva a prendere tranquillamente tutti i dati senza problemi. Non potrei neanche tenere le date come dici te, perchè le due date potrebbero essere distanti qualche giorno, e se alla query passo una data centrale quel record si deve visualizzare, quindi devo sempre avere 2 date, inizio e fine.
    In pratica la prima tabella contiene tutti i dati per creare una pagina del sito, e la seconda tabella contiene la lista di tutte le categorie di quella pagina creata (le pagine sono eventi sportivi). Ora invece tutte le ricerche si basano sulla seconda tabella, ma tutti i dati da prelevare si trovano nella prima, e per avere una retrocompatibilità con i dati già immessi non posso fare molte modifiche, ora il cliente vuole che alle categorie di quella pagina creata siano impostate delle date,perchè devono poter essere listate separatamente. Non posso fare modifiche al db anche perchè molte altre sezioni del sito prendono i dati da quelle due tabelle, e siccome il budget è molto basso non posso modificare molte cose.
    Provo la query che hai detto, ma non so se va, ricordo di aver provato con le INNER JOIN e non mi restituiva tutti i dati previsti.
    Ok era solo un suggerimento per rendere il tutto più ''pulito''. Se devi tenerlo così, usa la stessa query che ti ho scritto sopra e al posto di ''WHERE data Between .....'' puoi scriverla così :

    '...WHERE datainizio>='01/02/2003' AND datafine<='15/02/2003' '; il resto della query dovrebbe essere giusto in quanto prende tutti i valori delle due tabelle, se non ti tornano tutti i valori che vorresti potrebbe essere perchè da una parte o dall'altra manca la corrispondenza, in quel caso, sosituisci INNER JOIN con LEFT JOIN che ti prende tutti i valori anche senza corrispondenza di id. Prova e facci sapere ciao.

  9. #9
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    c.d_ini<='2008-12-06' OR '2008-12-06'<=c.d_fine

    Cambia OR con AND

  10. #10
    Se ti servono i valori tra due intervalli credo sia più corretto usare AND, che verifica tutte e due le condizioni, ovvero che il campo data deve essere maggiore o uguale al VALORE 1 e minore uguale al VALORE2. Se metti OR basta che una delle due condizioni sia verificata e esegue la query prendendo anche valori che magari non ti interessano, dipende da cosa vuoi estrarre.
    Dai un'occhiata qui:

    http://msdn.microsoft.com/it-it/library/ms187922.aspx
    5ym0

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.