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

    query su db con left join

    ho un db con 3 colonne:
    id, data, quantity

    stavo cercando di fare un join per farmi mostrare i risultati di tutti gli id divisi per data... non sapendo come fare mi sono autovincolato e ho messo 2 date io a mano e ho creato questo:

    SELECT a.*, b.quantity old
    FROM `db` a
    LEFT JOIN `db` b
    ON a.id = b.id
    WHERE a.data = '2011-05-09' AND b.data = '2011-05-08'

    il problema di questo join e' che (oltre a non farmi vedere tutte le possibili combinazioni con le altre date) se il mio db e' fatto cosi'

    1 2011-05-09 1
    2 2011-05-09 3
    3 2011-05-09 0
    1 2011-05-08 2
    2 2011-05-08 1
    3 2011-05-08 1

    non ci sono problemi
    ma se cancello anche una sola entry dal giorno vecchio (oppure inserisco un nuovo id e quindi ci saranno solo i dati di oggi e non quelli vecchi) al posto di mostrarmi

    il campo old con NULL non mi da proprio l'entry (ed ovviamente e' giusto che sia cosi' da quel where :P)

    come posso fare per risolvere con questa query?
    W magica ROMA!

  2. #2
    ma se tu metti una tabella in left join con sé stessa, il record cancellato da "a" è cancelato anche in "b"... se vuoi un NULL, il record deve esistere in una delle due (ma se è solo una...)

    cosa vuoi fare esattamente?

  3. #3
    voglio creare una tabella divisa per date nel senso
    tabella attuale:


    codice:
    ID      DATE            QUANTITY   
    1       2011-05-09        1
    2       2011-05-09        3
    3       2011-05-09        0
    1       2011-05-08        2
    2       2011-05-08        1
    3       2011-05-08        1
    44     2011-05-09        99
    dopo il select vorrei avere

    codice:
    ID      QUANTITY (del 09)     QUANTITY (del 08)  
    1               1                    2
    2               3                    1
    3               0                    1
    44        NULL (o anche 0)          99
    invece con la mia query l'id 44 nn e' presente
    e inoltre con la mia query se ho + date e non solo 2 gestisco sempre 2 date


    praticamente dovrei assegnare ad ogni id un'array di quantity per ogni giorno ovvero un

    for i bla bla bla
    SELECT quantity, date FROM db where id = i

    pero' fatto in automatico da sql + semplicemente... il db e' parecchio lungo quindi andare a far 2000 query non mi pare il caso
    W magica ROMA!

  4. #4
    prova ad utilizzare group_concat()

    esempio usando / come separatore dei dati:

    codice:
    select id, 
    group_concat(data order by data separator '/') as data,
    group_concat(quantity order by data separator '/') as quantity
    from db
    group by id
    poi fai l'explode e ti trovi con due array equivalenti con date e quantita'. Ogni record del result set si portera' un id con tutte le date e tutte le quantita'

    non puoi fare una join usando una AND nel where. Sei sulla stessa tabella quindi le date ci devono essere tutte, non esiste un NULL.

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

  5. #5
    umm vabbe' alla fine ho risolto senza sql
    ho caricato praticamente tutto il db negli oggetti ...
    dovro' vedere quanto diventa pesante in futuro perche' con il db da testing che sto usando ora con una 30ina di entry posso far tutte le porcate che voglio e non noto mai niente

    (sto facendo 1 applicazione per android quindi cercavo di ottimizzare... ma credo che non si possa fare tanto semplicemente e il libro di sql l'ho prestato ad 1 mio amico e non l'ho + rivisto :P)

    cmq l'and del join era un WHERE
    facendo varie prove e' diventato un AND e quando ho incollato qui non me ne sono accorto


    cmq a titolo informativo piero con il tuo modo non funziona perche' parti dal presupposto che le date ci siano tutte

    il problema non sono le date ... sono le quantita' che non sono sempre per tutte le date

    come ho postato sul 2° post sull'id 44 non c'e' la quantity del giorno 2011-05-08 di conseguenza quando vai a far la query ti perdi alcuni dati ed essendo mischiati non sai manco + quali sono


    in java ho "risolto" in questo modo
    codice:
    sql = "SELECT * FROM db WHERE date ">= ? ORDER BY date DESC, id;
    		c = mDb.rawQuery(sql, new String[] { getDaysBefore(dayNumber) }); //getdaysbefore(x) prende la lista dei giorni e vede qual'e' l'x-esimo giorno ... questo per diminuire un po il carico
    		id_col = c.getColumnIndex("id");
    		quantity_col = c
    				.getColumnIndex("quantity");
    		int i = 0;
    		while (c.moveToNext()) { //<-- iteratore
    			id = c.getInt(id_col) - 1;
    			if (i > id) {
    				while (i < map.size()) {
    					map.get(i).getQuantityList().add(0);
    					i++;
    				}
    				i = 0;
    			}
    			while (id > i) {
    				map.get(i).getQuantityList().add(0);
    				i++;
    			}
    			i++;
    			map.get(id).getQuantityList().add(c.getInt(quantity_col));
    		}
    		while (i < map.size()) {
    			map.get(i).getQuantityList().add(0);
    			i++;
    		}
    la mappa e' del tipo <int id, obj> e l'ho precostruita con una query precedente in cui associo gli id ad altra roba
    W magica ROMA!

  6. #6
    non devi mettere la tabella in join con sé stessa, ma con un'altra tabella che contiene solo date

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