Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    617

    Escludere da una query l'id e il gruppo di risultati se un valore non è accettato

    Perdonate, non sapevo come titolare il post.
    Tant'è che chiedo aiuto per effettuare questa query.

    In pratica devo tirare fuori gli id di tutti gli ordini del mio sito che al loro interno hanno prodotti di fornitori specifici. Basta che un' ordine abbia 1 fornitore in + rispetto a quelli dichiarati, che l'ordine non deve essere considerato.

    Come tutti i classici schemi di ecommerce ho una tabella ordini, con id univoco e una tabella ordini_prodotti all'interno della quale c'è tra le colonne e l'id dell'ordine e l'id del prodotto (altri dati ci risultano inutili al nostro fine).

    FAccio una query di questo genere:

    Codice PHP:
    $forn_accettati = array("pippo");
    SELECT id_ordini from tab_ordini to
    INNER JOIN ordini_prodotti op ON
    (to.ordine_id op.ordine_id)
    INNER JOIN tab_prodotti tp ON(op.id_prodotto tp.id_prodotto)
    WHERE tp.fornitore IN(implode........array $forn_accettati
    In questo modo mi tira fuori tutti gli ordini con pippo al loro interno, ma mi tira fuori anche gli ordini che oltre pippo hanno pure pluto.
    Io vorrei unicamente quelli con pippo, se c'è un fornitore in più NON dichiarato nell'array allora va saltato.

    Possibile fare na roba del genere o sono un folle?

    Grazie in anticipo

  2. #2
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,359
    Quesito più difficile di quanto pensassi dunque più interessante.

    Prova questo (non testato).

    Codice PHP:
    <?php
    $forn_accettati 
    = array("pippo"); 
    $numero_elementi count($forn_accettati);
    // l'articolo deve avere tutti i fornitori della lista - quindi una INNER JOIN per fornitore funziona da AND => fornitore 1 and fornitore 2 etc...
    $innerClause "";
    foreach(
    $forn_accettati as $chiave => $valore)
    {
     
    $innerClause .= " INNER JOIN tab_prodotti tp$chiave ON (op.id_prodotto = tp$chiave.id_prodotto) and tp$chiave.fornitore = '$valore' ";
    }
    // il numero dei fornitori per l'articolo deve essere pari al numero di fornitori nella lista
    $whereClause " WHERE EXISTS(SELECT COUNT(*) FROM tab_prodotti tpx WHERE op.id_prodotto = tpx.id_prodotto HAVING COUNT(*) = $numero_elementi)";
    // con la prima clausola siamo sicuri di prendere un articolo "aperto" sù tutti i fornitori
    // con la seconda scartiamo gli articoli che hanno più fornitori del numero di fornitori della lista
    $query "SELECT id_ordini from tab_ordini to INNER JOIN ordini_prodotti op ON(to.ordine_id = op.ordine_id)"
             
    $innerClause $whereClause;
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    617
    Ciao Grazie della risposta in primis.

    In realtà credo di essermi espresso male, una cosa del genere l'ho provata anche io però succede che se in un ordine ho un prodotto del fornitore pippo e uno del fornitore pluto, l'orrdine viene comunque considerato, perchè il fornitore è cmq presente.

    Io vorrei che gli ordini presi in considerazione abbiano unicamente "pippo" come fornitore al loro interno e se ve ne è uno in più devono essere scartati. Con un solo fornitore nell'array la query proposta andrebbe anche bene ma se oltre a pippo ci fosse un'altro fornitore nell'array la questione si complica.

    Con due fornitori nell'array, mi servirebbe tirare fuori tutti gli ordini con "pippo" e "pluto" o solo con "pippo" o solo con "pluto", se vi è un fornitore in più non menzionato devo saltare l'ordine.

    Più ci penso e più credo non si possa fare senza ciclare i risultati ma resto speranzoso, grazie sempre in anticipo.

  4. #4
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,359
    A questo punto prova cosi. Sempre non testato.

    codice:
    $forn_accettati = array("pippo");
    $numero_elementi = count($forn_accettati);
    SELECT id_ordini from tab_ordini to
    INNER JOIN ordini_prodotti op ON(to.ordine_id = op.ordine_id)
    INNER JOIN tab_prodotti tp ON (op.id_prodotto = tp.id_prodotto and tp.fornitore IN(implode........array $forn_accettati))
    WHERE EXISTS(SELECT COUNT(*) FROM tab_prodotti tpx WHERE op.id_prodotto = tpx.id_prodotto HAVING COUNT(*) = $numero_elementi)";
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  5. #5
    un altro approccio potrebbe essere quello di selezionare tutti gli ordini che contengono un prodotto dei fornitori "buoni", escludendo poi tutti gli ordini che contengono un prodotto dei fornitori "cattivi". ti ritrovi solo ordini con solo prodotti dei fornitori "buoni"

  6. #6
    qualcosa del tipo

    codice:
    SELECT 
       * 
    FROM 
       Ordini O JOIN Articoli A 
       ON O.Articolo=A.Articolo 
    WHERE 
       A.Fornitore IN (...elenco_fornitori_buoni...) 
       AND O.NumeroOrdine NOT IN 
       (
          SELECT NumeroOrdine 
          FROM Ordini O JOIN Articoli A ON O.Articolo=A.Articolo 
          WHERE A.Fornitore NOT IN (...elenco_fornitori_buoni...) 
       )
    certo, potresti ammazzare il server, soprattutto se i "buoni" sono pochi. ti converrebbe usare delle temp, ma non so se con MySQL è facile da farsi...

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.