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

    Clausola where e dati mancanti

    Salve ragazzi.
    Sto facendo un catalogo multilingua.
    In questo catalogo l'admin ha la possibilità di inserire vari dati nelle varie lingue disponibili. Ora, l'admin, potrebbe anche decidere di inserire alcune informazioni multilingua in italiano e non inserirle in inglese e cose del genere.
    Ci sarà, però, sempre una lingua "completa" nel senso che in quella lingua i dati saranno sicuramente presenti per tutti i prodotti.
    La query, quindi, dovrebbe estrarre i dati nella lingua selezionata dall'utente ma, qualora l'admin non abbia inserito i dati in quella lingua, dovrà estrarre i dati nella lingua sicuramente presente.

    Io ho provato a fare una cosa del genere:

    Codice PHP:
    SELECT catalog_products.name AS name ,
           
    catalog_objects.obj AS obj ,
           
    catalog_products.code AS code ,
           
    catalog_brands.brand AS brand ,
           
    catalog_materials.material AS material ,
           
    catalog_products.price AS price ,
           
    catalog_products.discount AS discount ,
           
    catalog_products.availability AS availability ,
           
    catalog_targets.target AS target ,
           
    catalog_products.inserted AS inserted ,
           
    catalog_products.views AS views

    FROM catalog_products
    LEFT JOIN catalog_objects ON catalog_objects
    .ref catalog_products.obj
    LEFT JOIN catalog_brands ON catalog_brands
    .id catalog_products.brand
    LEFT JOIN catalog_materials ON catalog_materials
    .ref catalog_products.material
    LEFT JOIN catalog_targets ON catalog_targets
    .ref catalog_products.target
    WHERE catalog_objects
    .lang OR catalog_objects.lang 2
    AND   catalog_materials.lang OR catalog_materials.lang 2
    AND   catalog_targets.lang OR catalog_targets.lang 
    Con l'OR, però, di 11 righe che andrebbero estratte me ne estrae ben 84. Come risolvere il problema? Se non fossi stato abbastanza chiaro ditemelo che cerco di spiegarvi meglio la situazione. Grazie mille! Ciao!
    eCommerceRS.NET - Commerciante, vendi on-line!
    Il mio nick è mircov e non mirco!!!

  2. #2
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Io mi sono sempre rifiutato di imparare chi abbia la precedenza fra OR ed AND. Mi sembra probabile che nel tuo caso la mancanza di parentesi crei confusione. Al tuo posto ne aggiungerei tre paia

  3. #3
    Potresti essere un po' più preciso? Non ho mai usato le parentesi nelle queries e quindi non ho la minima idea di cosa tu voglia dire!
    eCommerceRS.NET - Commerciante, vendi on-line!
    Il mio nick è mircov e non mirco!!!

  4. #4
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    WHERE (catalog_objects.lang = 1 OR catalog_objects.lang = 2)
    AND (catalog_materials.lang = 1 OR catalog_materials.lang = 2)
    AND (catalog_targets.lang = 1 OR catalog_targets.lang = 2)


    (sempre che abbia capito quello che vuoi fare)

  5. #5
    No, il risultato è sempre lo stesso!

    In effetti sarebbe una cosa del genere se si potessero utilizzare gli if nella query:

    codice:
    se esiste la lingua passata
      {
        estrai la lingua passata
      }
    altrimenti
      {
        estrai la lingua di default
      }
    Questo nella clausola where.
    Però sembra che crei tipo delle combinazioni visto che i record in tutto sono 11 e invece ne vengono restituiti 84.
    eCommerceRS.NET - Commerciante, vendi on-line!
    Il mio nick è mircov e non mirco!!!

  6. #6
    puoi utilizzare gli if nelle query

    ma a parte questo ...

    spiega un po meglio per cosa intendi "la lingua passata", dove questo parametro nella query?

    WHERE catalog_objects.lang = 1 OR catalog_objects.lang = 2
    AND catalog_materials.lang = 1 OR catalog_materials.lang = 2
    AND catalog_targets.lang = 1 OR catalog_targets.lang = 2

    allora ... il where funziona che se il risultato complessivo delle operazioni booleane è TRUE allora estrae la riga altrimenti nulla

    di conseguenza tu devi fare in modo di far tornare TRUE se ti interessa estrarre la riga o false se non la vuoi

    ora se ho capito a te interessa estrarla solo se le tre tabelle hanno nella riga la colonna lang impostata su 1 o 2

    per fare una cosa di questo tipo il codice che ti ha dato luca dovrebbe andare bene, il problema è, mi sa, che non abbiamo capito bene cosa ti serve fare :\

    ora ... gli IF li puoi "creare" tu manualmente

    infatti gli IF lavora pure con le condizioni booleano di conseguenza se, ad esempio, vuoi far si che le varie colonne lang abbiano 1 o 2 come valore devi costruire un "IF" in cascata

    se prendiamo in considerazione
    codice:
    catalog_objects.lang = 1 OR catalog_objects.lang = 2
    da solo questo codice vediamo che non fa altro che dire che il valore catalog_objects.lang deve essere uno o due.

    A te interessa fare questo su i valori di tre tabelle diverse messe nelle join, di conseguenza devi usare le parentesi!

    (catalog_objects.lang = 1 OR catalog_objects.lang = 2) AND (catalog_materials.lang = 1 OR catalog_materials.lang = 2)

    guarda la struttura impostata in questo modo

    (FALSE/TRUE OR FALSE/TRUE) AND (FALSE/TRUE OR FALSE/TRUE)

    AND per restituire TRUE vuole due valori in input TRUE altrimenti restituisce FALSE
    OR per restituire TRUE necessità che un solo input sia TRUE di conseguenza restituisce FALSE solo se sono tutti e due zero

    quindi mettiamo che
    catalog_objects.lang = 1

    e
    catalog_materials.lang = 2

    quindi sostituendo i valori nell'espressione preecdente avremmo
    (catalog_objects.lang = 1 OR catalog_objects.lang = 2) AND (catalog_materials.lang = 1 OR catalog_materials.lang = 2)

    =

    (TRUE OR FALSE) AND (FALSE OR TRUE)

    =

    TRUE AND TRUE

    =

    TRUE

    di conseguenza viene estratta la riga

    la stessa cosa con 3 o più valori

    però a questo punto, se quello che volevi fare è questo, controlla i valori presenti nel database, per la query che esegui, perché la query che ti ha dato luca è corretta

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2003
    Messaggi
    591
    Per la where va sicuramente bene con le parentesi proposte se non altro per facilitarne la lettura.
    Il tuo problema sta nella from .
    per estrarre i dati come vuoi tu dubito che riuscirai con un'unico sql.
    d'altronde se ad un'elemento della prima tabella corrispondono 2 sulla seconda avrò come risultato 2 record. se ad ogni record di quest'ultima corrispondono 2 record della terza avrò 4 record e così via in modo esponenziale.

  8. #8
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Credo di aver capito qual è il tuo problema.
    La query che ne esce è mostruosa...
    ora non ho tempo di scriverla, ma provo a spiegartela.

    Devi raddoppiare tutte le join sulle tre tabelle multilingua (perché poi la quarta non ce l'ha?), mettendo nelle condizioni di join la lingua a 1 sulla prima e a 2 sulla seconda (fra l'altro non so nemmeno quanto sia ortodosso dal punto di vista dell'sql).
    Poi devi usare degli IFNULL sulla select in modo da estrarre ogni volta i dati dalla seconda tabella quando la prima non ce l'ha.

    Immagino che non si sarà capito niente, ma per ora non posso fare di più

  9. #9
    Innanzi tutto grazie per le risposte.
    Ora cerco di rispiegarvi un attimo cosa voglio fare esattamente.
    Partiamo dal fatto che il sito è multilingua.
    Le lingue esistenti sul sito sono memorizzate nel db in una tabella che ha tre campi: id, lang, abbreviation
    Il campo id è autoincrement
    lang memorizza il nome della lingua (italiano, english, ecc.)
    abbreviation memorizza l'abbreviazione della lingua (it, en, ecc.)

    Il catalogo ha, invece, più tabelle con più campi:

    catalog_brands (id, brand) (memorizza le marche senza multilingua)
    catalog_materials (id, ref, material, lang) (memorizza i materiali)
    catalog_objects (id, ref, object, lang) (memorizza i tipi di oggetti)
    catalog_targets (id, ref, target, lang) (memorizza i target: uomo, donna, bambino, ecc)

    Fatto questo quadro panoramico passiamo al problema.
    L'utente può scegliere la lingua in cui desidera visualizzare il sito. Le lingue ora sono solo due (italiano ed inglese).
    Ma l'amministratore potrebbe non aver inserito tutti i dati in tutte le lingue! Ciò vuol dire che, per assurdo, un target potrebbe essere definito in italiano ma non in inglese come potrebbe essere definito in inglese ed in italiano. La lingua sicuramente presente sarà l'italiano (quella che io ho chiamato lingua di default).

    Quando vado ad estrarre i dettagli di un prodotto, quindi, devo estrarre i dati nella lingua richiesta: se è italiano estraggo i dati in italiano mentre se è inglese estraggo i dati in inglese. la clausola where, quindi, sarebbe così (ammettendo che it = 1 e en = 2) qualora l'utente abbia scelto l'inglese come lingua da visualizzare:

    codice:
    WHERE catalog_objects.lang = 2
    AND catalog_materials.lang = 2
    AND catalog_targets.lang = 2
    Fin qui nessun problema: i dati vengono estratti correttamente.

    Ma che succederebbe se l'admin non avesse impostato i valori in inglese per uno dei campi? Non verrebbe visualizzato niente! Ecco che entra in gioco la clausola where:

    codice:
    WHERE catalog_objects.lang = 2 (o se inesistente catalog_objects = 1)
    AND catalog_materials.lang = 2 (o se inesistente catalog_materials = 1)
    AND catalog_targets.lang =  (o se inesistente catalog_targets = 1)
    Se il dato non esiste in inglese estrae quello in italiano (che è considerata lingua di default)

    Non mi interessa controllare prima se ogni tabella ha anche la parte nella lingua selezionata. Il controllo va effettuato tabella per tabella (quindi avrei una pagina diciamo multilingua, in inglese ed in italiano contemporaneamente).

    Spero di essere stato più chiaro adesso!

    PS
    Avrete notato che alcune tabelle hanno un campo "ref". Quello è il campo utilizzato per effettuare la join poichè gli id sono autoincrement e quindi non avrei potuto memorizzarli nel campo apposito che memorizza i prodotti.
    eCommerceRS.NET - Commerciante, vendi on-line!
    Il mio nick è mircov e non mirco!!!

  10. #10
    ok ... ho capito

    lui con quel where estrae TUTTE le righe che hanno la lingua di default e la lingua richiesta

    e su questo non puoi fare nulla perché dovresti verificare i dati estratti

    ti consieglio di lasciare cosi la query e di fare il lavoro tramite php

    infatti quando selezioni il testo ti basta che ti cicli tutto e ti crei un'array basandoti sulla chiave unica che è REF

    while($row = mysql_fecth_assoc($query))
    {
    if (!isset($lista[$row['ref']]))
    {
    // imposti la riga
    }
    else
    {
    // ti limiti a verificare se la lingua presente in questa riga è quella richiesta (se lo è vuol dire che la riga che hai inserito è con la lingua di default) e quindi ti limiti ad impostare la lingua richiesta
    }
    }

    e poi ti ricicli l'array lista e stampi tutto quello che vuoi

    altrimenti puoi fare anche un'altra cosa più carina

    se imposti un'order by con i settaggi che ti servono ed alla fine metti il valore di lang ordinato in maniera discedente (mettendo che la lingua di default è una) puoi stampare tutto mentre cicli!

    In questo modo ti fai un'array dove vai ad inserire i vari ref e se già è stata inserita una riga salti il ciclo corrente altrimenti stampi a video con la lingua presente e aggiungi a quest'array il valore che ti serve

    PS: sono tutte ipotesi ovviamente però spero ti siano in qualche modo utili

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.