Newsgroup: it.comp.www.php
Titolo: LEFT JOIN di 1 solo record ?

salve,
io ho una SELECT che aggrega con un LEFT JOIN table1 a table2.
il problema è ke la relazione table1 -> table2 è del tipo uno a molti...
ma a me serve prendere solo il + recente record di table2...
come fare?
avevo pensato a DISTINCT.. ma credo nn possa funzionare xkè i record
ottenuti sono tutti diversi visto ke combinano i campi di table1 e table2...
ho provato col GROUP BY, ma poi ho trovato ke:
"Quando si specifica GROUP BY, è necessario che l'elenco GROUP BY includa
tutte le colonne di un'espressione non di aggregazione dell'elenco di
selezione oppure che l'espressione GROUP BY corrisponda esattamente
all'espressione dell'elenco di selezione."
e se devo specificare tutti i campi selezionati alla fine cosa mi serve il
GROUP BY? ottengo un semplce ORDER BY?
poi nella documentazione ho trovato la funzione DistinctCount... che pensavo
potesse risolvere il tutto... ma è stato decisamente peggio :'( nn ci ho
capito niente.
Come risolvere?

 ha scritto nel messaggio
news:VplIa.113578$pR3.2...@news1.tin.it...


A dire il vero non ho capito molto....
Questa tabella sotto non ha molto senso.... devi fare un join con la stessa
tabella?
supponiamo che ci siano 2 tabelle per capirsi: articoli e categoria
articoli:
            cat_id
            art
categorie
            cat_id
            nome_categoria
tu vuoi fare un join su cat_id
mettiamo dei dati nelle tabelle
categorie
1 cartacei
2 ferrei
articoli
1 quaderno
1 busta
2 rete
2 martello
1 risma
2 lampada
se fai un join ottieni
cartacei quaderno
cartacei  busta
ferrei rete
ferrei martello
cartacei  risma
ferrei lampada
Di questi quale vuoi ottenere??
in base a che criterio?

 ha scritto nel messaggio
news:DqGIa.118403$pR3.2...@news1.tin.it...


Scusa una domanda.... adesso provo a pensarci, ma tu usi mySQL (se si dimmi
la versione) o un altro DB? se usi MSSQL si risolve presto...
con mysql bisogna vedere come gestisce le sottoquery

mettiamo che hai ste due tabelle:
chiamate
        id_chiamata
        id_cliente
        dettagli
assistenza
        id_assistenza
        id_cliente
        scadenza
facciamo il join su id_cliente ovviamente e poi raggruppiamo per id_chiamata
(a noi serve una riga per chiamata!)
SELECT chiamate.id_chiamata, MAX(assistenza.scadenza) AS scadenza_vera
FROM chiamate INNER JOIN assistenza ON chiamate.id_cliente =
assistenza.id_cliente
GROUP BY chiamate.id_chiamata;
dovrebbe fungere al tuo scopo
ciao

 ha scritto nel messaggio
news:fRHIa.217477$g92.4...@news2.tin.it...


 ha scritto nel messaggio
news:dZUIa.120543$pR3.2...@news1.tin.it...


Allora... forse ho risolto... speriamo!
siccome la tua query è un po incasinata e non so bene come sono le relazione
nel DB ti pongo una soluzione
mettiamo che tu vuoi sapere della tabella assistenza di ogni cliente
l'ultima assicurazione valida. allora per avere solo quelle righe puoi fare
questo select qua sotto
SELECT assistenza.*
FROM (SELECT MAX(assistenza.data_fine) AS scadenza, assistenza.id_cliente AS
id_cliente
FROM assistenza
GROUP BY assistenza.id_cliente) AS cliente_scadenza INNER JOIN prova ON
(cliente_scadenza.id_cliente = assistenza.id_cliente) AND
(cliente_scadenza.scadenza = assistenza.scadenza);
se crei una view con questa select ottieni una tabella come assistenza, col
vantaggio che hai solo l'ultimo contratto valido per ogni cliente.
Nel tuo select sotto quindi invece di utilizzare la tabella assistenza nella
query usi la view.
Ovviamente se invece di avere l'assistenza sul cliente la hai sul prodotto
basta che cambi poche cose...
Fammi sapere