Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    Query complicata in mysql

    Devo lavorare in mysql su due table che hanno in comune il campo "Prodotto ID#".
    Sia dalla prima che dalla seconda devo estrarre dei campi selezionando alcune condizione (where......).
    Oltre a questo non voglio prendere in considerazione nella seconda table quei record che hanno un "Prodotto ID#" già presente nella prima.
    Come ulteriore complicazione dovrei ordinare il risultato per valori crescenti di "Prodotto ID#" sia per la prima che per la seconda table.

    Avrei proprio necessità di fare questo con una unica query, ma non sono abbastanza esperto per riuscirci. Qualcuno può darmi una mano?
    Grazie - Giovanni

  2. #2
    detto brevemente vuoi ricavare i record della tab2 che non hanno il riferimento con la tab1.

    Prova con un left join:

    codice:
    select *
    from tab1
    left join tab2 using(Prodotto_ID)
    where tab2.Prodotto_ID IS NULL
    and tab1.tuo_campo = '$ciccio'  /// esempio per ulteriore condizione
    order by tab1.Prodotto_id
    in tab2 Prodotto_ID e' NULL perche' sono valorizzati gli ID dei soli prodotti associati. Quindi NON sono nella logica ulteriori scelte sui record di tab2.

    Se invece tu avessi dei record con ID valorizzato ma non associato alla tab1 allora dovresti invertire nella query le tabelle, cioe' tab1 diventa tab2 e viceversa.

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

  3. #3
    Grazie piero.mac.
    Ho provato a codificare:

    $products_query_raw = "select * from " .
    TABLE_PRODUCTS_WITH_ATTRIBUTES_STOCK . " as a " .
    " left join " . TABLE_PRODUCTS . " as b using (products_id)
    where b.products_id is null and
    a.quantity <='" . $stock_reorder_level . "' and
    b.products_quantity <='" . $stock_reorder_level . "'
    order by a.products_id, a.stock_id, b.products_id";

    dove le stringhe in maiuscolo sono costanti.
    Non mi da errore, ma non mi ritorna nessun record! Dove è che sbaglio?
    Grazie - Giovanni

  4. #4
    codice:
    where b.products_id is null 
    and
    ......
    and
    b.products_quantity <='" . $stock_reorder_level . "'
    Come gia' ti ho detto prima se il product_id e' NULL non puo' essere che products_quantity contenga qualcosa di utile, tutto il record e' NULL.

    Inoltre non mi torna cosa vorresti fare con questa query.....
    codice:
    a.quantity <='" . $stock_reorder_level . "' 
    and
    b.products_quantity <='" . $stock_reorder_level
    .... con questa tua affermazione:
    Oltre a questo non voglio prendere in considerazione nella seconda table quei record che hanno un "Prodotto ID#" già presente nella prima.
    Se non hanno riferimento puoi solo avere la lista dei record non associati della prima tabella oppure avere la lista dei record della seconda che non risultassero associati alla prima. Ma la ricerca che vorresti fare tu prevede che i record siano associati quindi l'id presente in entrambe le tabelle.

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

  5. #5
    La notte porta consiglio, e ho proprio paura di aver preso "lucciole per lanterne":

    La TABLE_PRODUCTS contiene l'elenco di tutti i prodotti, e la chiave primaria è 'products_id'. Uno dei campi disponibili è 'products_quantity'

    La table TABLE_PRODUCTS_WITH_ATTRIBUTES_STOCK contiene l'elenco dei prodotti che hanno caratteristiche particolari, i cui campi devono essere elaborati. La chiave primaria è 'stock_id', e vi sono, oltre ad altri, due campi 'products_id' e 'quantity'.

    Il processo logico che voglio seguire è:

    1) Avere tutti i record della TABLE_PRODUCTS_WITH_ATTRIBUTES_STOCK
    2) Avere i record della TABLE_PRODUCTS il cui 'products_id' non è contenuto nella prima, cioè tutti prodotti non presenti nella prima.
    3) Avere come risultato un unico elenco ordinato per 'products_id', contenente tutti i campi della prima e quelli della seconda (in realtà me ne servirebbero solo due) nel quale saprò distinguere per esempio se un prodotto sarà della originaria TABLE_PRODUCTS, perchè il valore di 'stock_id' sarà nullo.
    4) Eliminare dall'elenco i prodotti con 'products_quantity' e 'quantity' maggiori di un certo dato.

    Dopo aver rimuginato e letto un po' credo che la soluzione stia in una "query nidificata" o nell'adozione di una TEMPORARY TABLE, cose molto belle ed eleganti da dirsi, ma con la mia poca esperienza.....

    Pensi di potermi aiutare? - Grazie - Giovanni

  6. #6
    Utente di HTML.it L'avatar di clasku
    Registrato dal
    Aug 2006
    Messaggi
    3,197
    e facendo una right join?

    Una cosa tipo

    Select * from tabella_STOCK right join tabella_PRODOTTI on campo_chiave WHERE quello che vuoi

    in teoria così ti dovrebbe restituire tutti i prodotti della seconda tabella, anche se non hanno collegamenti con la prima...

    Prova...

  7. #7
    Sto facendo un po' di prove:

    $products_query_raw = "select * from " . TABLE_PRODUCTS_WITH_ATTRIBUTES_STOCK .
    " right join " . TABLE_PRODUCTS . " on products_id ";

    mi da errore:
    Column 'products_id' in on clause is ambiguous in:
    [select count(*) as total from products_with_attributes_stock right .........

    $products_query_raw = "select * from " . TABLE_PRODUCTS_WITH_ATTRIBUTES_STOCK .
    " right join " . TABLE_PRODUCTS . " using (products_id) ";

    mi fa vedere tutti i prodotti.
    A questo punto ho pensato di avere a disposizione tutti i campi delle due table, ed ho incominciato a mettere una condizione.


    $products_query_raw = "select * from " . TABLE_PRODUCTS_WITH_ATTRIBUTES_STOCK .
    " right join " . TABLE_PRODUCTS .
    " using (products_id)
    where (quantity = '". $stringa_vuota . "' AND
    products_quantity <='" . $stock_reorder_level . "')";


    Non viene visualizzato nessun prodotto.
    Allora ho provato ad invertire la condizione

    $products_query_raw = "select * from " . TABLE_PRODUCTS_WITH_ATTRIBUTES_STOCK .
    " right join " . TABLE_PRODUCTS .
    " using (products_id)
    where (products_quantity = '". $stringa_vuota . "' AND
    quantity <='" . $stock_reorder_level . "')";

    Non viene visualizzato nessun prodotto.
    infine ho provato a semplificare

    $products_query_raw = "select * from " . TABLE_PRODUCTS_WITH_ATTRIBUTES_STOCK .
    " right join " . TABLE_PRODUCTS .
    " using (products_id)
    where quantity <='" . $stock_reorder_level . "'";

    e mi si presentano tutti i prodotti della sola
    TABLE_PRODUCTS_WITH_ATTRIBUTES_STOCK
    mentre quelli della TABLE_PRODUCTS non sono presenti, anche se non c'è nessuna limitazione al campo products_quantity di tali prodotti.

    Ora sono veramente "cotto"!!!!!
    Riprendo nel pomeriggio.... ma non so cosa pensare !!!!

    Giovanni

  8. #8
    Originariamente inviato da g.nencini
    La notte porta consiglio, e ho proprio paura di aver preso "lucciole per lanterne":

    La TABLE_PRODUCTS contiene l'elenco di tutti i prodotti, e la chiave primaria è 'products_id'. Uno dei campi disponibili è 'products_quantity'

    La table TABLE_PRODUCTS_WITH_ATTRIBUTES_STOCK contiene l'elenco dei prodotti che hanno caratteristiche particolari, i cui campi devono essere elaborati. La chiave primaria è 'stock_id', e vi sono, oltre ad altri, due campi 'products_id' e 'quantity'.

    Il processo logico che voglio seguire è:

    1) Avere tutti i record della TABLE_PRODUCTS_WITH_ATTRIBUTES_STOCK
    2) Avere i record della TABLE_PRODUCTS il cui 'products_id' non è contenuto nella prima, cioè tutti prodotti non presenti nella prima.
    3) Avere come risultato un unico elenco ordinato per 'products_id', contenente tutti i campi della prima e quelli della seconda (in realtà me ne servirebbero solo due) nel quale saprò distinguere per esempio se un prodotto sarà della originaria TABLE_PRODUCTS, perchè il valore di 'stock_id' sarà nullo.
    4) Eliminare dall'elenco i prodotti con 'products_quantity' e 'quantity' maggiori di un certo dato.

    Dopo aver rimuginato e letto un po' credo che la soluzione stia in una "query nidificata" o nell'adozione di una TEMPORARY TABLE, cose molto belle ed eleganti da dirsi, ma con la mia poca esperienza.....

    Pensi di potermi aiutare? - Grazie - Giovanni
    Non si capisce se sono 2 tabelle gemelle (prodotti e prodotti in stock) o hai un'anagrafica e una tabella di appoggio per i prodotti in stock. Nel secondo caso il left join deve funzionare. Altrimenti in teoria dovresti usare una UNION.
    dA .. foto di viaggio
    L'esperienza è il tipo di insegnante più difficile.
    Prima ti fa l'esame, e poi ti spiega la lezione.

  9. #9
    La table TABLE_PRODUCTS contiene TUTTI I PRODOTTI presenti in magazzino.

    La table TABLE_PRODUCTS_WITH_ATTRIBUTES_STOCK contiene delle informazioni supplementari ed alternative (esempio campi 'products_quantity' nella prima e 'quantity' nella seconda) per ALCUNI PRODOTTI che sono ovviamente anche presenti nella TABLE_PRODUCTS.

    Ogni prodotto nelle due table ha lo stesso 'products_id'.

    Hai comunque scartato l'idea di una "query nidificata"?
    Vedrò di fare ancora un po' di prove.

    Giovanni

  10. #10
    La query nidificata non mi pare una necessità al momento.
    Comincia con un LEFT JOIN e poi procedi aggiungendo condizioni, tipo
    codice:
    SELECT 
    	TS.products_id 
    	,TP.*
    --      IF(TS.quantity IS NOT NULL, TS.quantity, TP.products_quantity) qta
    from 
    	TABLE_PRODUCTS TP
    left join 
    	TABLE_PRODUCTS_WITH_ATTRIBUTES_STOCK TS 
    	ON TP.products_id=TS.products_id
    poi decommenti l'IF, alla fine aggiugi una condizione sulla quantità e sull'ordinamento.
    dA .. foto di viaggio
    L'esperienza è il tipo di insegnante più difficile.
    Prima ti fa l'esame, e poi ti spiega la lezione.

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.