Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [MySQL] Query: ma cosa dovrebbe fare?

    Ciao a tutti,

    non capisco cosa dovrebbe fare questa query: mi verrebbe da dire che è sintatticamente errata invece funziona ...

    codice:
    SELECT DISTINCT
                     finalcode , 100.0*count(finalcode)/b.N as p , count(finalcode) as t FROM step2,step3 as b
                     GROUP BY finalcode ORDER BY t DESC
    allora finalcode è un campo, step2, step3 sono tabelle

    grazie mille in anticipo ...
    RiKkArDo on IRCnet

  2. #2
    vorrei specificare che non capisco se il distinct è riferito solo a finalcode oppure sia a finalcode che a p;
    se N è un capo della tabella step3, b.N cos'è? Ho letto da qualche parte che potrebbe essere un alias. E' vero? Perchè viene introdotto?
    insomma non capisco comq funziona la query
    RiKkArDo on IRCnet

  3. #3
    codice:
    SELECT DISTINCT finalcode , 
    100.0 * count(finalcode) / b.N as p,
    count(finalcode) as t 
    FROM step2, step3 as b
    GROUP BY finalcode 
    ORDER BY t DESC
    Non so che conteggi/valori possa dare visto che manca la relazione tra le due tabelle. Il DISTINCT non serve, e' un doppione del GROUP BY.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    60
    la query, apparte per 100.0*count(finalcode)/b.N
    dovrebbe selezionare il campo finalcode dalla tabella che lo ha come colonna, raggruppare i risultati per finalcode diversi e ordinarli per t decrescente.
    esempio :
    finalcode
    100
    101
    104
    100
    101
    100

    risultato:
    finalcode | p | t
    100 | 100.0 *3/b.N | 3
    101 | 100.0 *2/b.N | 2
    104 | 100.0 *1/b.N | 1

    Il problema e` che non vi e` una condizione tra le due tabelle, del tipo
    step2.id=step3.id
    Questo vuol dire che la query va in join su tutti i campi di tutte le tabelle riportandoti come numero di risultati il prodotto delle righe di una tabella per il prodotto delle righe dell'altra.
    Cosa sia b.N non so dirtelo

  5. #5
    Originariamente inviato da rikkardo
    vorrei specificare che non capisco se il distinct è riferito solo a finalcode oppure sia a finalcode che a p;
    se N è un capo della tabella step3, b.N cos'è? Ho letto da qualche parte che potrebbe essere un alias. E' vero? Perchè viene introdotto?
    insomma non capisco comq funziona la query
    b.N // alias di step3.campo_N.

    Il distinct si estende a tutto il select, ma per i raggruppamenti ci vuole GROUP BY ...

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    60
    b.N // alias di step3.campo_N.
    per essere vero questo alias nella query devi inserire i valori degli alias.
    Ovvero
    select * from step2 a, step3 b
    allora puoi inserire b.N al posto di step3.N

    comunque senza relazione tra le tabelle (a.X=b.Y) la query dara` risultati non corretti.

  7. #7
    continuo a non capire
    Provo a fare un esempio (tratto dalla documentazione mySQL su www.mysql.org)
    codice:
    +----------+--------+---------+------+------------+------------+
    | name     | owner  | species | sex  | birth      | death      |
    +----------+--------+---------+------+------------+------------+
    | Fluffy   | Harold | cat     | f    | 1993-02-04 | NULL       |
    | Claws    | Gwen   | cat     | m    | 1994-03-17 | NULL       |
    | Buffy    | Harold | dog     | f    | 1989-05-13 | NULL       |
    | Fang     | Benny  | dog     | m    | 1990-08-27 | NULL       |
    | Bowser   | Diane  | dog     | m    | 1979-08-31 | 1995-07-29 |
    | Chirpy   | Gwen   | bird    | f    | 1998-09-11 | NULL       |
    | Whistler | Gwen   | bird    | NULL | 1997-12-09 | NULL       |
    | Slim     | Benny  | snake   | m    | 1996-04-29 | NULL       |
    | Puffball | Diane  | hamster | f    | 1999-03-30 | NULL       |
    +----------+--------+---------+------+------------+------------+
    se io eseguo questa query:
    codice:
    SELECT DISTINCT owner, species from pet
    ottengo come risultato le colonne owner e species "depurate da doppioni" ovvero così?
    codice:
    | owner  | species
    +--------+--------
    | Harold | cat     
    | Gwen   | cat    
    | Harold | dog     
    | Benny  | dog     
    | Diane  | dog    
    | Gwen   | bird     
    | Benny  | snake   
    | Diane  | hamster
    oppure il distinct agisce solo sul primo campo ovvero su owner?
    RiKkArDo on IRCnet

  8. #8
    ho provato con il query browser. Elimina i doppioni della coppia owner,species spero sia corretto
    RiKkArDo on IRCnet

  9. #9
    Originariamente inviato da piero.mac
    Il DISTINCT non serve, e' un doppione del GROUP BY.
    in che senso ?
    RiKkArDo on IRCnet

  10. #10
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    60
    La DISTINCT agisce sugli elementi che selezioni (la coppia se ne selezioni due, il singolo se uno, e cosi` via).
    Quindi nell'esempio che hai fatto la query seleziona le coppie senza ripeterle.
    Sul fatto che il group by sia uguale al distinct, ho qualche rimostrnza.
    Potrebbe dare gli stessi risultati in alcuni e banali casi.

    Con il distinct selezioni gli elementi distinti di un elenco.
    Con il group by raggruppi gli elementi di un elenco per un determinato campo.

    Se prendiamo il tuo esempio:
    Select Distinct owner from pet
    seleziona :
    codice:
     
    | owner  |
    +--------+
    | Harold |     
    | Gwen   |         
    | Benny  |    
    | Diane  |
    con il group by puoi ad esempio contare le occorrenze
    Select owner, count(*) from pet group by pet
    seleziona:
    codice:
    | owner  | count(*)
    +--------+--------
    | Harold | 2     
    | Gwen   | 3         
    | Benny  | 2     
    | Diane  | 2
    o magari
    Select owner, count(*) from pet group by pet having count>2
    seleziona:
    codice:
    | owner  | count(*)
    +--------+--------     
    | Gwen   | 3
    Se il group by viene utilizzato solo per selezionare elementi distinti di un elenco allora le performance della query calano,rispetto alla distinct, soprattutto in basi di dati con molti record.
    Infatti in questi casi e` preferibile utilizzare distinct che e` molto piu` performante.
    Spero di essere stato abbastanza chiaro

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 © 2024 vBulletin Solutions, Inc. All rights reserved.