Visualizzazione dei risultati da 1 a 6 su 6

Discussione: query concatenate

  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    171

    query concatenate

    salve. ho ancora bisogno del vostro prezioso aiuto.

    ho una tabella composta cosi:

    utente oggetto prezzo
    1 A 5
    1 A 10
    2 A 7
    1 B 5
    2 B 7
    1 C 3

    Ho questa tabella, dove utente è colui che fa un offerta, oggetto e l'oggetto messo all'asta, prezzo è il prezzo che un utente offre.

    prendo l'id dell'utente dalla sessione e devo fare una query per estrarre i dati in questo modo.

    utente in sessione per esempio A

    prendere il nome di tutti gli oggetti che A ha fatto un offerta.
    prendere l'offerta piu alta fatta per quel oggetto fatta da tutti gli utenti

    è possibbile farla con una sola query ?

    io avevo pensato di fare cosi

    select max(prezzo), oggetto from tabella where utente= A

    pero cosi prende il prezzo piu alto fatto da A, mentre io voglio il prezzo piu alto in assoluto.

    come posso fare ?

    quale è la soluzione migliore ?

  2. #2
    Semplicemente, tu vuoi fare in una sola query due aggregazioni diverse: questo è semplicemente impossibile.

    Mi sorge però spontaneo un quesito: ma non è che per caso entrambe le tue richieste riguardano gli oggetti su cui A ha fatto almeno un'offerta?

    Se così fosse dovresti prima di tutto trovare questi oggetti, usarli come filtro sulle offerte e quindi trovare l'offerta massima per ciascuno di essi.

    Dopodichè, quando leggi i dati restituiti da questa query, non è difficile inserire in un array i nomi degli oggetti, evitando di inserirli se doppi; questo array sarà la lista dei nomi degli oggetti su cui A ha fatto un'offerta.

    Per capirci:

    select distinct idoggetto from offerte where idutente=a

    Sono tutti gli oggetti su cui A ha fatto un'offerta.

    select * from offerte where idoggetto in (select distinct idoggetto from offerte where idutente=a)

    Sono tutte le offerte per oggetti su cui A ha fatto almeno un'offerta.

    select max(prezzo), idoggetto from (select * from offerte where idoggetto in (select distinct idoggetto from offerte where idutente=a)) AS offerte GROUP BY idoggetto

    Sono i prezzi massimi offerti per gli oggetti su cui A ha fatto un'offerta.

    select max(prezzo), idoggetto, oggetti.nome from (select * from offerte where idoggetto in (select distinct idoggetto from offerte where idutente=a)) AS offerte left JOIN oggetti on idoggetto=oggetti.id GROUP BY idoggetto

    Aggiunge una join per leggere dalla tabella oggetti il nome dell'oggetto, così da poter usare la tecnica dell'array di nomi oggetti che ti indicavo sopra.

    Ciao!
    "Le uniche cose che sbagli sono quelle che non provi a fare."
    Atipica

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    171
    si io voglio prendere il nome dell'oggetto su cui A ha fatto un offerta e contemporaneamente prendere anche l'offerta massima fatta per l'oggetto che A ha fatto un offerta.
    anche se il prezzo massimo non lo ha fatto A.

    Poi una volta che ho il risultato nell'array come dicevi tu, mi basta fare un while e scorrere l'array e prendere i risultati giusto ?

  4. #4
    Io non userei un while per fare un ciclo su un array, utilizzarei un foreach, ma si, in sostanza si.
    "Le uniche cose che sbagli sono quelle che non provi a fare."
    Atipica

  5. #5
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Certamente si puo fare solo con una semplice query Pero non capisco cosa bisogna fare
    Quote Originariamente inviata da processore Visualizza il messaggio
    ho una tabella composta cosi:
    utente oggetto prezzo
    1 A 5
    1 A 10
    2 A 7
    1 B 5
    2 B 7
    1 C 3
    utente è colui che fa un offerta,
    oggetto e l'oggetto messo all'asta,
    prezzo è il prezzo che un utente offre.
    Fino a qui è tutto chiarissimo

    Quote Originariamente inviata da processore Visualizza il messaggio
    prendo l'id dell'utente dalla sessione e devo fare una query per estrarre i dati in questo modo.
    utente in sessione per esempio A
    Spiegaci cosa è la sessione

    Quote Originariamente inviata da processore Visualizza il messaggio
    prendere il nome di tutti gli oggetti che A ha fatto un offerta.
    A è stato definito come oggetto , un oggetto fa una offerta per altri oggetti ??

    Quote Originariamente inviata da processore Visualizza il messaggio
    è possibbile farla con una sola query ?
    Si se ci spieghi bene, con 2 sottoquery puoi fare tutto

    Quote Originariamente inviata da processore Visualizza il messaggio
    select max(prezzo), oggetto from tabella where utente= A
    Adesso sembrerebbe che A è un utente ????

    Dicci il qualcosa di piu e il risultato che vuoi ottenere da quella tabellina sopra

    .
    Ultima modifica di nman; 23-02-2014 a 10:48

  6. #6
    in pratica, vuoi ottenere la lista degli oggetti per i quali un dato utente da fatto almeno un'offerta, e per ognuno di questi oggetti avere l'offerta più alta fatta da qualunque utente. corretto?

    inoltre, con quale db stai lavorando? (va indicato, come da regolamento )

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.