Back to top

Autore Topic: Query multiple  (Letto 3251 volte)

Offline grad

  • Esploratore
  • **
  • Post: 70
    • Mostra profilo
Query multiple
« il: 15 Lug 2013, 17:30:39 »
Sempre qui a dar noia... ;)
Ho bisogno di fare due query. Ho una vista con 2 tabelle..
Nella prima tabella stampo dei servizi di base che pesco dal db, nella seconda tabella (che sta visivamente sotto la prima) dovrei stampare dei servizi PERSONALI che ha ogni cliente. Nel db sono correttamente inseriti, ma visivamente non so come prenderli... Io stavo usando il solito model (si può?).
Ho dovuto costruire due funzioni getListQuery() ma solo la prima funziona.. nell'altra non mi riempie l'array che poi prendo nella view con il $row->   come mai?
Per chiarezza vi posto il codice intero del mio model.


Citazione

<?php
   defined('_JEXEC') or die();
   
   jimport( 'joomla.application.component.modellist' );
   
   class AnagraficheModelServiziassociatiaggiunt ivi extends JModelList
   {
      public function __construct($config = array())
      {
         if (empty($config['filter_fields']))
         {
            $config['filter_fields'] = array('id_tipologia_socio', 'id_servizio', 'nome_servizio', 'cod_persona', 'cod_serv', 'nome_serv');
         }
     
         parent::__construct($config);
      }
     
      function getListQuery()
      {
         $db = JFactory::getDBO();
         $query = $db->getQuery(true);
         $query->select('id_tipologia_socio, id_servizio, nome_servizio');
         $query->from('#__associazione_servizi as serviziassociati, #__elenco_servizi');
         $query->where('cod_servizio=id_servizio');
         
         /* Tolta perchè dava più problemi che un libro di matematica
         $query->clear();
     
         $query->select('id_persona as cod_persona, id_servizio as cod_serv, nome_servizio as nome_serv')
               ->from('#__servizi_aggiuntivi as serviziaggiuntivi, #__elenco_servizi')
               ->where('cod_servizio=id_servizio');
         */
         
         $search = $this->getState('filter.search');
         if (!empty($search))
         {
            $search = $db->Quote('%'.$db->escape($search, true).'%');
            $query->where('(serviziassociati.id_tipologia_socio LIKE '.$search.')');
         }
         
         $query->order($this->getState('list.ordering', 'id_tipologia_socio').' '.$this->getState('list.direction', 'ASC'));


         return $query;
      }
     
      function getListQuery2()
      {   
         $db = JFactory::getDBO();
         $query = $db->getQuery(true);
         $query->select('id_persona as cod_persona, id_servizio as cod_serv, nome_servizio as nome_serv');
         $query->from('#__servizi_aggiuntivi as serviziaggiuntivi, #__elenco_servizi');
         $query->where('cod_servizio=id_servizio');
     
         
         $search = $this->getState('filter.search');
         if (!empty($search))
         {
            $search = $db->Quote('%'.$db->escape($search, true).'%');
            $query->where('(serviziaggiuntivi.id_persona LIKE '.$search.')');
         }
         
         $query->order($this->getState('list.ordering', 'id_persona').' '.$this->getState('list.direction', 'ASC'));
         $row = $db->loadResult();
         return $query;
      }
     
      protected function populateState($ordering = null, $direction = null)
      {
         // Load the filter state.
         $search = $this->getUserStateFromRequest($this->context.'.filter.search', 'filter_search');
         $this->setState('filter.search', $search);


         // List state information.
         parent::populateState($ordering, $direction);
      }
   }
?>
qualche idea?
« Ultima modifica: 15 Lug 2013, 17:56:02 da grad »

mau_develop

  • Visitatore
Re:Query multiple
« Risposta #1 il: 15 Lug 2013, 20:59:44 »
Usa JOIN
« Ultima modifica: 16 Lug 2013, 18:21:50 da M_W_C »

Offline grad

  • Esploratore
  • **
  • Post: 70
    • Mostra profilo
Re:Query multiple
« Risposta #2 il: 15 Lug 2013, 21:16:54 »
ma con la join unisco due tabelle di risultato... mi capita quindi che se come risultato ho 4 servizi generici + 2 servizi aggiuntivi personali i servizi personali mi vengono doppiati... e la cosa non va bene...


mi potresti fare un esempio?


questo sarebbe il mio risultato (allegato) che tra l'altro è errato... perchè dovrebbe essere così poi la mia stampa:
 Esempio tipologia VIP (ID=4) e Socio Mario Rossi (ID=1)

Servizi dedicati alla tipologia del socio: PILATES
Servizi aggiuntivi alla persona: ?? ?? dovrebbe essere PISCINA GRANDE ma non possiamo ricavarlo perchè lo so io che ho guardato il db ma da li non si capisce

[allegato eliminato automaticamente dopo un anno]
« Ultima modifica: 15 Lug 2013, 23:14:37 da grad »

Offline grad

  • Esploratore
  • **
  • Post: 70
    • Mostra profilo
Re:Query multiple
« Risposta #3 il: 15 Lug 2013, 23:27:45 »
Non si può proprio fare 2 query?

Offline grad

  • Esploratore
  • **
  • Post: 70
    • Mostra profilo
Re:Query multiple
« Risposta #4 il: 16 Lug 2013, 12:23:24 »
sennò stavo pensando... invece che due query, associare due model?

Offline grad

  • Esploratore
  • **
  • Post: 70
    • Mostra profilo
Re:Query multiple
« Risposta #5 il: 16 Lug 2013, 14:38:51 »
sto provando in tutti i modi.... non va... ho provato anche così ma niente:


Codice: [Seleziona]

<?php
defined('_JEXEC') or die();

jimport'joomla.application.component.modellist' );

class AnagraficheModelServiziassociatiaggiuntivi extends JModelList
{
public function __construct($config = array())
{
if (empty($config['filter_fields'])) 
{
$config['filter_fields'] = array('id_servizi_aggiuntivi''id_persona''id_servizio''nome_servizio');
}

parent::__construct($config);
}

function getListQuery()
{
/*
SELECT id_servizi_aggiuntivi, id_persona , id_servizio , nome_servizio
FROM joomlatest_servizi_aggiuntivi as serviziaggiuntivi, joomlatest_elenco_servizi
WHERE cod_servizio=id_servizio
*/
$db JFactory::getDBO();
$query $db->getQuery(true);
$query->select('id_servizi_aggiuntivi, id_persona , id_servizio , nome_servizio');
$query->from('#__servizi_aggiuntivi as serviziaggiuntivi, #__elenco_servizi');
$query->where('cod_servizio=id_servizio');
$result1 $db->loadResult();


$db->setQuery($query);
$query->select('id_tipologia_socio, id_servizio as cod_servizio, nome_servizio');
$query->from('#__associazione_servizi as serviziassociati, #__elenco_servizi');
$query->where('cod_servizio=id_servizio');
$result2 $db->loadResult();



$search $this->getState('filter.search');
if (!empty($search)) 
{
$search $db->Quote('%'.$db->escape($searchtrue).'%');
$query->where('(serviziaggiuntivi.id_persona LIKE '.$search.')');
}

$query->order($this->getState('list.ordering''id_persona').' '.$this->getState('list.direction''ASC'));
$row $db->loadResult();

return $query;
}

protected function populateState($ordering null$direction null)
{
// Load the filter state.
$search $this->getUserStateFromRequest($this->context.'.filter.search''filter_search');
$this->setState('filter.search'$search);


// List state information.
parent::populateState($ordering$direction);
}
}
?>


Offline grad

  • Esploratore
  • **
  • Post: 70
    • Mostra profilo
Re:Query multiple
« Risposta #6 il: 16 Lug 2013, 17:06:48 »
con la doppia query mi sono arresto.. tanto non va  :'(
Allora ho creato un altro model e dal controller principale (controller.php) ho dato alla view serviziassociatiaggiuntivi due Model: il primo si occupa di ricavare dal db tutti i servizi riguardo alla tipologia di cliente, il secondo invece quelli personali.
Il problema è che o funziona uno o funziona l'altro.. non sembrano andare d'accordo...
Posto il mio controller.php

Codice: [Seleziona]

<?php
   
// No direct access to this file
   
defined('_JEXEC') or die('Restricted access');


   
// import Joomla controller library
   
jimport('joomla.application.component.controller');


   
/**
    * General Controller of Anagrafiche component
    */
   
class AnagraficheController extends JController
   
{
      public function 
display($cachable false$urlparams false)
      {
         
// set default view if not set
         
JRequest::setVar('view'JRequest::getCmd('view''persone'));
         
         
         
$viewName JRequest::getCmd('view'$this->default_view);
         switch (
$viewName
         {
            case 
"serviziassociatiaggiuntivi":
               
               
$document JFactory::getDocument();
               
$viewType $document->getType();
               
$viewLayout JRequest::getCmd('layout''default');
               
               
$view $this->getView($viewName$viewType'', array('base_path' => $this->basePath'layout' => $viewLayout));
               
               
// Get/Create the model
               
$view->setModel($this->getModel('serviziassociatiaggiuntivi'));
               
$view->setModel($this->getModel('serviziassociati'),true);
               
               
//$view->assignRef('document', $document);
               
$view->display();
               
               break;
            default:
               
// call parent behavior
               
parent::display($cachable$urlparams);
               break;
         }
      }
   }
?>





model serviziassociatiaggiuntivi


Codice: [Seleziona]

<?php
   defined
('_JEXEC') or die();
   
   
jimport'joomla.application.component.modellist' );
   
   class 
AnagraficheModelServiziassociatiaggiunt ivi extends JModelList
   
{
      public function 
__construct($config = array())
      {
         if (empty(
$config['filter_fields'])) 
         {
            
$config['filter_fields'] = array('id_servizi_aggiuntivi''id_persona''id_servizio''nome_servizio''cod_servizio''id_tipologia_socio''nome_servizio');
         }
      
         
parent::__construct($config);
      }
      
      function 
getListQuery()
      {   
         
         
$db JFactory::getDBO();
         
$query $db->getQuery(true);
         
$query->select('id_servizi_aggiuntivi, id_persona , id_servizio , nome_servizio');
         
$query->from('#__servizi_aggiuntivi as serviziaggiuntivi, #__elenco_servizi');
         
$query->where('cod_servizio=id_servizio');


         
         
$search $this->getState('filter.search');
         if (!empty(
$search)) 
         {
            
$search $db->Quote('%'.$db->escape($searchtrue).'%');
            
$query->where('(serviziaggiuntivi.id_persona LIKE '.$search.')');
         }
         
         
$query->order($this->getState('list.ordering''id_persona').' '.$this->getState('list.direction''ASC'));
         
         return 
$query;
      }
      
      function 
test()
      {
         
$db JFactory::getDBO();
         
         
$query $db->getQuery(true);
         
$query->select('id_tipologia_socio, id_servizio as cod_servizio, nome_servizio');
         
$query->from('#__associazione_servizi as serviziassociati, #__elenco_servizi');
         
$query->where('cod_servizio=id_servizio');
         
$row $db->loadObjectList();
         
         return 
$row;
      }
      
      
      protected function 
populateState($ordering null$direction null)
      {
         
// Load the filter state.
         
$search $this->getUserStateFromRequest($this->context.'.filter.search''filter_search');
         
$this->setState('filter.search'$search);


         
// List state information.
         
parent::populateState($ordering$direction);
      }
      
   }
?>








model serviziassociati


Codice: [Seleziona]

<?php
defined('_JEXEC') or die();

jimport'joomla.application.component.modellist' );

class AnagraficheModelServiziassociatiaggiuntivi extends JModelList
{
public function __construct($config = array())
{
if (empty($config['filter_fields'])) 
{
$config['filter_fields'] = array('id_servizi_aggiuntivi''id_persona''id_servizio''nome_servizio''cod_servizio''id_tipologia_socio''nome_servizio');
}

parent::__construct($config);
}

function getListQuery()
{

$db JFactory::getDBO();
$query $db->getQuery(true);
$query->select('id_servizi_aggiuntivi, id_persona , id_servizio , nome_servizio');
$query->from('#__servizi_aggiuntivi as serviziaggiuntivi, #__elenco_servizi');
$query->where('cod_servizio=id_servizio');


$search $this->getState('filter.search');
if (!empty($search)) 
{
$search $db->Quote('%'.$db->escape($searchtrue).'%');
$query->where('(serviziaggiuntivi.id_persona LIKE '.$search.')');
}

$query->order($this->getState('list.ordering''id_persona').' '.$this->getState('list.direction''ASC'));

return $query;
}

function test()
{
$db JFactory::getDBO();

$query $db->getQuery(true);
$query->select('id_tipologia_socio, id_servizio as cod_servizio, nome_servizio');
$query->from('#__associazione_servizi as serviziassociati, #__elenco_servizi');
$query->where('cod_servizio=id_servizio');
$row $db->loadObjectList();

return $row;
}


protected function populateState($ordering null$direction null)
{
// Load the filter state.
$search $this->getUserStateFromRequest($this->context.'.filter.search''filter_search');
$this->setState('filter.search'$search);


// List state information.
parent::populateState($ordering$direction);
}

}
?>
« Ultima modifica: 16 Lug 2013, 17:09:59 da grad »

mau_develop

  • Visitatore
Re:Query multiple
« Risposta #7 il: 16 Lug 2013, 18:23:38 »
il modo giusto è usare join, il tuo problema sono le query non centra joomla.
Devi strutturare la query in modo che ritorni ciò che vuoi come lo vuoi.

Non possono tornarti valori uguali che si danno fastidio perchè con la join crei per ogni tabella un alias a. b. c. etc per cui non capisco proprio che problema tu possa avere se non di sintassi o logica errata

Offline grad

  • Esploratore
  • **
  • Post: 70
    • Mostra profilo
Re:Query multiple
« Risposta #8 il: 16 Lug 2013, 20:31:16 »
credo sia la mia logica...
allora queste sono le mie tabelle che prendo in considerazione per la mia query (elenco solo le colonne):

------------------------------------------------------------------------

anagrafiche_persone

id  | nome  | cognome | sesso |  telefono_1 | telefono_2 |  email |  citta  |  indirizzo | denominazione_socio



tipologia_socio
id   |   denominazione_socio   |   descrizione   |   quota_annua



elenco_servizi

cod_servizio   |   nome_servizio   |   descr_servizio   |   prezzo_servizio



associazione_servizi

id_associazione  |   id_tipologia_socio   |   id_servizio



servizi_aggiuntivi

id_servizi_aggiuntivi   |   id_persona   |   id_servizio

-------------------------------------------------------------------------------
La mia view cosa deve fare praticamente?
In una view dove ci sono tutti i miei clienti creata ciclando tutta la tabella "anagrafiche_persone", posso clikkare su SERVIZI e mi si apre una nuova view dove ci sono due tabelle.
Nella prima si vedono i servizi offerti di BASE dalla tipologia del socio, nella seconda invece si vedono quelli che il cliente ha richiesto personalmente pagando a parte!


Come potrei strutturare la join?


In allegato:
1. Viiew persone dove ci sono tutti i clienti con il relativo tipo di socio e il link ai servizi
2. view dei servizi associati: i primi quelli base inclusi a seconda della tipologia di appartenenza, i secondi quelli richiesti a parte e quindi PERSONALI.

[allegato eliminato automaticamente dopo un anno]
« Ultima modifica: 16 Lug 2013, 21:53:36 da grad »

mau_develop

  • Visitatore
Re:Query multiple
« Risposta #9 il: 16 Lug 2013, 20:54:35 »
quali sono i valori univoci in comune tra le tabelle?

Cerca un tutorial sulle join di mysql, le tabelle devono essere in relazione tra loro, avere delle foreign key

Offline grad

  • Esploratore
  • **
  • Post: 70
    • Mostra profilo
Re:Query multiple
« Risposta #10 il: 16 Lug 2013, 21:42:46 »
mi ero dimenticato scusami  :-\


Allora ecco qui l'sql così si capisce meglio


Codice: [Seleziona]




CREATE TABLE #__tipologia_socio (
   id   INTEGER AUTO_INCREMENT NOT NULL,
   denominazione_socio VARCHAR(255)          ,
   descrizione VARCHAR(255)            ,
   quota FLOAT(5,2)                    ,
   CONSTRAINT pk_#__tipologia_socio PRIMARY KEY (id)
)   ENGINE=INNODB;


CREATE INDEX denominazione_socio ON #__tipologia_socio(denominazione_socio);


CREATE TABLE #__anagrafiche_persone (
   id   INTEGER AUTO_INCREMENT not null,
   nome VARCHAR(255)                   ,
   cognome VARCHAR(255)                ,
   sesso VARCHAR(1)                    ,
   telefono_1 VARCHAR(20)              ,
   telefono_2 VARCHAR(20)              ,
   email VARCHAR(50)                   ,
   citta VARCHAR(20)                   ,
   indirizzo VARCHAR (50)              ,
   denominazione_socio VARCHAR (50)    ,
   Foreign Key (denominazione_socio) references #__tipologia_socio(denominazione_socio) ON UPDATE CASCADE ON DELETE SET NULL,
   CONSTRAINT pk_#__anagrafiche_persone PRIMARY KEY (id)
)   ENGINE=INNODB;


CREATE TABLE #__elenco_servizi (
   cod_servizio   INTEGER AUTO_INCREMENT not null,
   nome_servizio VARCHAR(255)          ,
   descr_servizio VARCHAR(255)         ,
   prezzo_servizio FLOAT(5,2)          ,
   CONSTRAINT pk_#__elenco_servizi PRIMARY KEY (cod_servizio)
)   ENGINE=MyISAM DEFAULT CHARSET=utf8;


CREATE TABLE #__associazione_servizi (
id_associazione INTEGER  AUTO_INCREMENT NOT NULL,
id_tipologia_socio INTEGER NOT NULL,
id_servizio INTEGER NOT NULL,
Foreign Key (id_tipologia_socio) references #__tipologia_socio(id) ON UPDATE CASCADE ON DELETE CASCADE,
Foreign Key (id_servizio) references #__elenco_servizi(cod_serivizo) ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT pk_#__associazione_servizi PRIMARY KEY (id_associazione)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


CREATE TABLE #__servizi_aggiuntivi (
id_servizi_aggiuntivi INTEGER  AUTO_INCREMENT NOT NULL,
id_persona INTEGER NOT NULL,
id_servizio INTEGER NOT NULL,
Foreign Key (id_persona) references #__anagrafiche_persone(id) ON UPDATE CASCADE ON DELETE CASCADE,
Foreign Key (id_servizio) references #__elenco_servizi(cod_serivizo) ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT pk_#__servizi_aggiuntivi PRIMARY KEY (id_servizi_aggiuntivi)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;



mau_develop

  • Visitatore
Re:Query multiple
« Risposta #11 il: 16 Lug 2013, 23:01:44 »
no ma aspetta...
non ho tempo di fare io il lavoro che dovresti fare tu, mi spiace.

Se ti dico che il modo è la join e per fare le join ti serve qualcosa su cui joinare (foreign key) non è che mi posti il codice e io guardo se hai o no le foreign key... puoi benissimo controllare tu, se non sai  qualcosa cerchi con google studi ciò che è lacunoso e torni coi nuovi problemi.
Così costringi le persone a farti i  lavori e alla fine non ti risponde più nessuno ... imho

Offline grad

  • Esploratore
  • **
  • Post: 70
    • Mostra profilo
Re:Query multiple
« Risposta #12 il: 16 Lug 2013, 23:15:49 »
nono.. aspetta, ci siamo fraintesi...
Io non ho chiesto di fare del lavoro per me!
Ho postato il codice per farti capire che secondo me la JOIN non funziona! Le foreign key ce l'ho e le ho messe e funzionano come vedi da codice...


Praticamente io devo ritornare due tabelle tipo


servizi_associati


id_tipologia_socio   |   id_servizio.associati   |   nome_servizio.associato


servizi_aggiuntivi

id_persona   |   id_servizio.aggiuntivi   |   nome_servizio.aggiuntivo


Con la JOIN a naso non mi sembra fattibile... attacca due tabelle che hanno qualcosa in comune! A me servono due select DISTINTE. A quel punto in teoria dovrebbero esserci tutti i valori  ritornati dentro l'array e li potrei usare nella mia view tramite $row->valore;




Spero di essere stato chiaro. Non fraintendiamoci, non voglio abusare di nessuno. Il problema mio credo sia nella logica, non nel non avere voglia e tempo di lavorarci. Ci sono dietro da 1 settimana!




PS: piccola idea dopo il mio sfogo... potrei inserire nella mia tabella servizi_aggiuntivi una colonna id_tipologia_socio così poi nella join faccio una cosa tipo servizi_aggiuntivi.id_tipologia_socio = servizi_associati.id_tipologia_socio. Dovrebbe funzionare, tanto una persona può avere SOLO una tipologia di socio ed essendo una foreign key appartenente alla tabella tipologie_socio nel caso di modifica, cancellazione si fa il cascade e si aggiorna ecc ecc...
« Ultima modifica: 16 Lug 2013, 23:23:56 da grad »

mau_develop

  • Visitatore
Re:Query multiple
« Risposta #13 il: 17 Lug 2013, 07:54:49 »
servizi_associati
id_tipologia_socio   |   id_servizio.associati   |   nome_servizio.associato

servizi_aggiuntivi
id_persona   |   id_servizio.aggiuntivi   |   nome_servizio.aggiuntivo


Le foreign key ce l'ho e le ho messe e funzionano
-----------------------------------------------------------------
quali sono in queste due tabelle i campi in relazione?

Offline grad

  • Esploratore
  • **
  • Post: 70
    • Mostra profilo
Re:Query multiple
« Risposta #14 il: 17 Lug 2013, 08:56:22 »
ecco.. quali sono i campi in relazione tra le due tabelle?!? NON ce ne sono!
Era questo il mio problema per la JOIN !!!! adesso praticamente che ho fatto ho fatto così:


servizi_associati[/size]id_tipologia_socio   |   id_servizio.associati   |   nome_servizio.associatoservizi_aggiunti viid_persona   |   id_servizio.aggiuntivi   |   nome_servizio.aggiuntivo   |   id_tipologia_socio


praticamente ho aggiunto il campo id_tipologia_socio che è in relazione a servizi_associati. Entrambe sono foreign key della tabella tipologia_socio.
Adesso provo a vedere se funziona! Tanto un utente può avere un solo tipo di socio quindi dovrebbe funzionare.


Offline grad

  • Esploratore
  • **
  • Post: 70
    • Mostra profilo
Re:Query multiple
« Risposta #15 il: 18 Lug 2013, 11:11:10 »
Il problema l'ho risolto  ;)  ovviamente non si poteva risolvere con una join perchè per come era strutturato il database e per alcune esigenze la soluzione consisteva di usare una UNION.




 



Web Design Bolzano Kreatif