Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20
  1. #1
    Utente di HTML.it L'avatar di telegio
    Registrato dal
    Sep 2001
    Messaggi
    2,592

    [consigli] ottimizzare query o query singola

    Non saprei davvero come titolare questo 3D..

    vado al dunque..
    sono in fase di progettazione, anche del DB..
    il progetto ERA una pagina dove erano elencate tutte le gallerie, con una foto di copertina e la descrizione. uno entrava dentro e si vedeva le foto caricate. quindi tipo 2 tabelle (copertine e gallerie) eccetera.. comunque FACILE..
    il cliente mi ha chiesto una modifica, che a lui pare facile, come al solito direi..
    in pratica questa lista di gallerie rimane tale ma si vedono quattro foto contenute nella galleria.
    sicuramente l'impaginazione sarà differente, ma anche la programmazione si "complica".
    La soluzione FACILE sarebbe: unica tabella con anagrafica e 10-20 campi foto. faccio il ciclo, lo stampo e sono a posto. MA. c'è una limitazione sul numero di foto.
    Quindi ho pensato: faccio 2 tabelle relazionate. in una ci metto "l'anagrafica" della galleria (nome, descrizione, data del progetto, eccetera..), nell'altra solo le foto. questo mi permetterebbe di inserire infinite foto, e qui la domanda.
    come potrei fare con una sola query questa visualizzazione di dati
    sarebbe così:
    descrizione
    foto1 - foto2 - foto3 - foto4
    solo che descrizione e foto (di foto ce ne possono essere anche 50..) sono in due tabelle differenti. so che devo usare join, ma mi restituisce tutte le foto relative alla galleria. vorrei limitare a 4 le foto che posso inserire..
    spero di essere stato chiaro..

    ringrazio ovviamente in anticipo chiunque mi darà una mano..

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    96

    Re: [consigli] ottimizzare query o query singola

    Originariamente inviato da telegio
    Non saprei davvero come titolare questo 3D..

    vado al dunque..
    sono in fase di progettazione, anche del DB..
    il progetto ERA una pagina dove erano elencate tutte le gallerie, con una foto di copertina e la descrizione. uno entrava dentro e si vedeva le foto caricate. quindi tipo 2 tabelle (copertine e gallerie) eccetera.. comunque FACILE..
    il cliente mi ha chiesto una modifica, che a lui pare facile, come al solito direi..
    in pratica questa lista di gallerie rimane tale ma si vedono quattro foto contenute nella galleria.
    sicuramente l'impaginazione sarà differente, ma anche la programmazione si "complica".
    La soluzione FACILE sarebbe: unica tabella con anagrafica e 10-20 campi foto. faccio il ciclo, lo stampo e sono a posto. MA. c'è una limitazione sul numero di foto.
    Quindi ho pensato: faccio 2 tabelle relazionate. in una ci metto "l'anagrafica" della galleria (nome, descrizione, data del progetto, eccetera..), nell'altra solo le foto. questo mi permetterebbe di inserire infinite foto, e qui la domanda.
    come potrei fare con una sola query questa visualizzazione di dati
    sarebbe così:
    descrizione
    foto1 - foto2 - foto3 - foto4
    solo che descrizione e foto (di foto ce ne possono essere anche 50..) sono in due tabelle differenti. so che devo usare join, ma mi restituisce tutte le foto relative alla galleria. vorrei limitare a 4 le foto che posso inserire..
    spero di essere stato chiaro..

    ringrazio ovviamente in anticipo chiunque mi darà una mano..
    Ciao no è che abbia capito molto, comunque se la join va bene, alla fine inserisci LIMIT,4
    penso che si scriva cosi, oppure vediti cosa fa LIMIT
    Ciao

  3. #3
    Utente di HTML.it L'avatar di telegio
    Registrato dal
    Sep 2001
    Messaggi
    2,592
    ma se metto limit 4 mi fa vedere 4 record (descrizioni) per volta.. mentre io vorrei tuuuutte le descrizioni e le relative prime 4 foto prese con una join..

    mi vado a vedere cosa fa di preciso LIMIT e se può essermi utile..
    grazie per ora..

  4. #4
    Utente di HTML.it L'avatar di telegio
    Registrato dal
    Sep 2001
    Messaggi
    2,592
    mmhh...
    non mi sono spiegato bene?
    da due tabelle collegate, con questo tipo di dati

    tabella1:
    id - descrizione
    1 - descrizione1
    2 - descrizione2
    ce ne sono altre, ma mi limito a questo..

    tabella2:
    id_foto - nomefoto
    1 - foto1
    2 - foto2
    1 - foto3
    1 - foto4
    2 - foto5
    2 - foto6
    1 - foto7
    1 - foto8
    1 - foto9
    1 - foto10
    2 - foto11

    quello che vorrei ottenere è:
    descrizione1
    foto1 - foto3 - foto4 - foto7
    descrizione2
    foto2 - foto5 - foto6 - foto11

    con una query.. forse con le sub, ma non so come usarle..

  5. #5
    Non sò se lo hai preso in considerazione... ma potresti fare due cicli... probabilmente esistono sistemi migliori.

    Il concetto sarebbe:

    Prendi tutti i dati da tabella 1 ordinati per nome descrizione ascendente

    poi da descrizione 1 prendi l'id, per cui cicli tutti i risultati di tabella 2.

    Se ti serve in fretta poterlo fare è il sistema più pratico.
    Se vuoi ridurre il codice potresti forse provare ad usare delle join (ma non usandole non saprei aiutarti in merito).

  6. #6
    Utente di HTML.it L'avatar di telegio
    Registrato dal
    Sep 2001
    Messaggi
    2,592
    grazie della risposta..
    saprei come farlo, ma due cicli significa 2 query.. io invece volevo ridurre a una.. anzi sarebbero di più: uno per la query principale, quella della descrizione, e una per ognuno dei cicli interni.. le join sono "facili", ma la limitazione nell'estrazione dei dati non riesco a farla..

    grazie comunque per ora..

  7. #7
    il group by non funziona in questo caso?

  8. #8
    premetto che sono un po arrugginito e che forse studiandosi bene le join si puo' fare esattamente quello che dici

    ti posso dare un risultato che si avvicina ( mi sono basato su mysql ma mi sembra che non l' hai detto )



    codice:
    SET GLOBAL group_concat_max_len=4096;
    
    SELECT Tabella1.descrizione AS descrizione, 
    GROUP_CONCAT(Tabella2.nomefoto ORDER BY Tabella2.nomefoto DESC SEPARATOR ', ') 
    AS nomefoto
    FROM Tabella1
    LEFT JOIN Tabella2 ON Tabella1.id=Tabella2.id_foto
    GROUP BY Tabella1.id ORDER BY NULL

    quello che otterresti e che dovresti manipolare con php sarebbe questo:

    descrizione nomefoto
    descrizione1 foto1, foto10, foto3, foto4, foto7, foto8, foto9
    descrizione2 foto11, foto2, foto5, foto6

    mi sono basato su quello che trovi scritto su questo link:
    http://www.mysqlitalia.it/articoli/8...-group-concat-


    la prima riga potresti non metterla ed io l' ho messa solo per rendere noto il valore di defaul ma se vuoi limitare il traffico ( l' approssimazione sta proprio nel fatto di non usare limit ) ti conviene mettere un valore accettabile e poi tenere solo i primi 4 risultati

    nota che l' ordinamento alfanumerico ti puo' giocare degli scherzi quando usi numeri come testo, ma basta essere chiari.

  9. #9
    Utente di HTML.it L'avatar di telegio
    Registrato dal
    Sep 2001
    Messaggi
    2,592
    CHE MERAVIGLIA..
    l'ho modificata così..
    Codice PHP:
    SELECT descrizioni.descrizione AS descrizioneGROUP_CONCATfoto.nomefoto
    ORDER BY foto
    .id_foto ASC
    SEPARATOR 
    ', ' ) AS nomefoto
    FROM descrizioni
    LEFT JOIN foto ON descrizioni
    .id foto.id_desc
    GROUP BY descrizioni
    .id
    ORDER BY NULL
    LIMIT 0 
    30 
    in modo che ordino i risultati non per nomefoto ma per id di inserimento.. così se vogliono visualizzare "le prime 4 che hanno messo" non posso sbagliare..
    tanto le immagini saranno massimo 10-12.. 4096 spero non ci arrivino mai..

    con PHP invece dovrei usare explode, e prendere i valori di un array da 0 a 3.. o sbaglio?
    Codice PHP:
    $valori explode(", "$valoredinomefotopresodalDB);
    echo 
    $valori[0];
    echo 
    $valori[1];
    echo 
    $valori[2];
    echo 
    $valori[3]; 
    una roba simile..
    ma se ho meno di 4 valori? cioè di 4 foto?

  10. #10
    Il massimo di 4096 sarebbero i caratteri infatti avevo provato ad impostare il parametro a 4 ed ho capito l' equivoco (altrimenti era perfetto) .

    Dovresti usare lo split della stringa limitandolo ad un massimo di 4
    Codice PHP:
    $valori  preg_split(', '$valoredinomefotopresodalDB4); 
    e dopo ciclare su tutti i valori
    Codice PHP:
    foreach ($valori as $nome) { 
    echo 
    $nome
    }; 
    Fai un po di prove e verifiche comunque il concetto e' che con l' espressione regolare limiti il massimo a 4 e con il ciclo non ti devi preoccupare quando hai meno valori.


    Correggo una cosa che ho detto prima: il massimo di default sarebbe 1024 caratteri

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.