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

    PHP e MySql modo migliore per implementare relazione uno a molti

    Ciao a tutti non so se la sezione in cui scrivo è quella corretta ma dato che sto sviluppando con PHP reputo sia corretta...

    cmq il mio problema è di carattere generale e di ottimizzazione e non so esattamente quale scelta fare per implementarlo

    semplificando ho progettato un blog con 2 tabelle (Entità)
    Notizie e Immagini una notizia può avere 0,N immagini e per implementare questa cosa ho creato una terza tabella che contiene l'identificativo della notizia e quello dell'immagine

    il problema nasce quando voglio mettere piu notizie in unica pagina perchè con 1 Query se prendo 10 notizie da visualizzare e poi x ogni notizia devo eseguire una nuova query

    con questo sistema arrivo a 11 query solo per visualizzare 10 notizie se poi aggiungiamo che ho anche altre Entità in relazione con la Notizie velocemente arrivo a 21/31 query...

    c'e un sistema migliore per realizzare questo?
    (Sto gia utilizzando la classe PDO )

    potrebbe essere una soluzione migliore caricare le 10 notizie e poi con un unica query e caricare tutte le immagini di tutte le notizie con una seconda query e poi creare una funzione che prende solo quelle richieste?

    grazie in anticipo a tutti
    www.nintendopower.it

  2. #2
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Puoi fare tutto in una sola query.

    notizie :
    • id_notizia,
    • titolo,
    • testo,
    • data_notizia


    immagini :
    • id_immagine,
    • id_notizia,
    • url_immagine.


    codice:
    select A.id_notizia as id_not, titolo, testo, data_notizia, url_immagine  from notizie A
    inner join immagini B on A.id_notizia= B.id_notizia
    where <quello che vuoi>
    order by data_notizia, A.id_notizia
    limit <quello che vuoi>
    Ecco una bozza per sftruttare i dati ricavati dalla query.
    Codice PHP:
    $sav_data "";
    $sav_id "";
    while (
    $row = .....) {
      if (
    $sav_id <> $row['id_not'] || $sav_data <> $row['data_notizia']) {
         
    $sav_id $row['id_not'];
         
    $sav_data $row['data_notizia'];     
         
    // qui stampi i dati relativi alla notizia
      
    }
      
    // qui stampi i dati relativi alle immagini

    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
    grazie sembra proprio quello che mi serviva non so xke nn mi veniva di usare le join in questo modo ^_^
    www.nintendopower.it

  4. #4
    a mente fresca ho provato a usare quella strategia ma c'e un problema con il limitare la query
    la strutture è questa (le immagini sn diventate tag ma il conetto è usguale)

    ods_Page :

    • id,
    • titolo,
    • data,

    ods_Tags :

    • id,
    • tag,


    ods_Tags_Reference :

    • id_page,
    • id_tag,
    • testo,
    • data_notizia


    la query è e funziona bene tranne il fatto del limit xke ovviamente non prende come limite le prime 10 notizie ma le prime 10 tag

    SELECT P . * , TR . * , T . *
    FROM ods_Page AS P
    LEFT JOIN ods_Tags_Reference AS TR ON P.id = TR.id_page
    LEFT JOIN ods_Tags AS T ON TR.id_tag = T.id
    ORDER BY P.date DESC, TR.pos ASC
    LIMIT 0 , 10
    è possibile limitare in qualche modo solo le notizie?


    averei ipotizzato di modificare la query in questo modo ma putroppo genera un errore
    #1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
    Codice PHP:
    SELECT P . * , TR . * , . *, I.*FROM ods_Page AS PLEFT JOIN ods_Tags_Reference AS TR ON P.id TR.id_pageLEFT JOIN ods_Tags AS T ON TR.id_tag T.idLEFT JOIN ods_Images AS I ON P.image I.id

    WHERE P
    .id IN SELECT id FROM ods_Page LIMIT 010 )
    ORDER BY P.date DESCTR.pos ASC 
    Ultima modifica di Oscurodrago; 24-05-2017 a 10:18
    www.nintendopower.it

  5. #5
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Avrei fatto come te.

    Comunque. Da adattare al tuo caso.

    codice:
    select * from (select @c:=0) ROWS
    inner join (select @c:=@c+1 AS num_row, id_m, value from `master`) A on 1=1
    inner join `detail` B on A.id_m = B.id_m 
    where num_row <= 2
    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

  6. #6
    smanettando ho trovato questa soluzione che per quanto scema funziona ed è piu chiara
    spero non infici troppo cm soluzione

    Codice PHP:
    SELECT P . * , TR . * , . *, I.*FROM ods_Page AS PLEFT JOIN ods_Tags_Reference AS TR ON P.id TR.id_pageLEFT JOIN ods_Tags AS T ON TR.id_tag T.idLEFT JOIN ods_Images AS I ON P.image I.id
    WHERE P
    .id IN SELECT FROM (            SELECT id             FROM ods_Page            ORDER BY date DESC          LIMIT 010      ) as )
    ORDER BY P.date DESCP.id DESCTR.pos ASC 
    www.nintendopower.it

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.