Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di carlo2002
    Registrato dal
    Jun 2002
    Messaggi
    2,743

    aiuto query x relazione molti-a-molti

    per creare delle associazioni molti-a-molti utilizzo le seguenti
    tabelle:

    tabella_elementi_principali
    - id_elemento_principale
    ...

    tabella_elementi_associabili
    - id_elemento_associabile
    ...

    tabella_elementi_associati
    - id_elemento_associato
    - id_elemento_principale
    - id_elemento_associabile

    allo script che inserisce le associazioni invio i
    seguenti dati:

    $id_elemento_principale
    $array_id_elementi_associabili

    il problema è che nell'array contenente gli id degli
    elementi associabili ci possono essere degli elementi
    già associati e devo evitare il loro re-inserimento.

    per fare questo, mi sono inventato un ciclo sull'array
    e controllo una x una se esistono già delle
    corrispondenze con gli id dell'elemento principale e
    quello associabile.
    Codice PHP:
    foreach($array_id_elementi_associabili 
    as $id_elemento_associabile) {

       
    # controllo elementi già associati
       
    $conteggio_elementi_associati mysql_query("
       SELECT COUNT(*) AS totale
       FROM  tabella_elementi_associati
       WHERE id_elemento_principale = 
    $elemento_principale
       AND   id_elemento_associabile = 
    $id");
       
    $conteggio mysql_fetch_array($conteggio_elementi_associati);
       
    $numero_elementi_associati $conteggio['totale'] ;

       if ( 
    $numero_elementi_associati == ) {

             
    $associazione "
             INSERT
             INTO tabella_elementi_associati
             (
             id_elemento_principale,
             id_elemento_associabile
             )
             VALUES(
             '
    $id_elemento_principale',
             '
    $id_elemento_associabile'
             )
             "
    ;
          }

    La cosa mi sembra poco ortodossa e vi chiedo
    se la faccenda può essere risolvibile tramite sql
    senza dover fare cicli.

    grazie
    Errare humanum est, perseverare ovest

  2. #2
    La cosa piu' corretta e' verificare se gia' esiste l'associazione.
    Anche perche' e' probabile che se esiste tu voglia/debba associare qualcosa d'altro oppure rinunciare perche' gia' presente.

    In pratica su che e' basata l'univocita' ?:

    elemento_principale con elemento_associato oppure solo l'elemento associato?

    In entrambi i casi pero' non vedo perche' fare un ciclo se conosci a priori il dato da inserire. Se invece non conosci il dato da inserire e tutto sommato non importa quale, purche sia uno non ancora associato, metti una flag di associato si/no alla tabella elementi associabili e ne prelevi uno a caso da quelli con associato = no.


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

  3. #3
    Utente di HTML.it L'avatar di carlo2002
    Registrato dal
    Jun 2002
    Messaggi
    2,743
    l'univocità è data da id_elemento_principale e id_elemento_associabile
    , in pratica dovrei chiedere questo:

    nella tabella_elementi_associati

    per ogni elemento contenuto nell'array_id_elementi_associabili

    inserisci
    nel campo id_elemento_principale il valore
    di $id_elemento_principale
    e
    nel campo id_elemento_associabile
    gli id contenuti nell'array_id_elementi_associabili

    quando
    non c'è già un record in cui coesistono
    il valore di $id_elemento_principale
    e
    uno dei valori presenti nell'array_id_elementi_associabili


    la rinuncia è vicina...
    Errare humanum est, perseverare ovest

  4. #4
    Hai provato a mandarlo a settimana enigmistica come scioglilingua???

    Metti un indice UNIQUE nella tabella elementi_associati che comprenda i due campi "id_elemento_principale" e "id_elemento_associabile", poi invece di INSERT utilizza REPLACE.

    Se esiste un elemento dell'indice (cioe' i due campi of course) identico a quello che vuoi inserire questo doppione viene praticamente sovrascritto (quasi fosse un UPDATE) altrimenti viene aggiunto come se fosse un INSERT.


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

  5. #5
    Utente di HTML.it L'avatar di carlo2002
    Registrato dal
    Jun 2002
    Messaggi
    2,743
    si, si, si, funziona proprio bene senza quel bartezzaghi che avevo partorito, tengo il ciclo per contare gli elementi inseriti, pensavo ad INSERT multiplo ma non mi piace.

    ho creato la tabella così:
    codice:
    CREATE TABLE `tabella_elementi_associati` (
      `id_elemento_associato` int(10) unsigned NOT NULL auto_increment,
      `id_elemento_associabile` int(10) unsigned NOT NULL default '0',
      `id_elemento_principale` int(10) unsigned NOT NULL default '0',
      PRIMARY KEY (`id_elemento_associato`),
      UNIQUE KEY `id_principale_e_associabile` (`id_elemento_associabile`,`id_elemento_principale`)
    ) TYPE=MyISAM ;
    grazie mille

    Errare humanum est, perseverare ovest

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.