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

    [MySQL] collegamenti tabelle

    Ciao, ho due tabelle

    elenco elementi
    elenco voti apportati dagli utenti sugli elementi


    io vorrei eseguire una query che passando come parametro l'ID utente (uid), ritorni *tutti* gli elementi della tabella 1 (elementi) e nel caso in cui ci sia un voto apportato dall'utente a qualche record della tabella elementi, visualizzare un campo aggiuntivo user_rate col valore eseguito dall'utente

    se l'utente non ha apportato voti all'elemento mi basta che user_rate sia NULL (ovviamente non zero)

    quindi voglio visualizzare tutti i record della tabella elementi con un campo aggiuntivo user_rate imposato a

    - NULL se nella tabella dettaglio questo utente non ha votato nulla
    - valore della votazione inserita dall'utente


    (altro dubbio: come posso evitare che nella secoda tabella ci siano due voti da parte di un utente sullo stesso elemento?? dovrei impostare come chiave primaria id_location e uid?? oppure altro?)


    tabella elementi

    Codice PHP:


    CREATE TABLE 
    IF NOT EXISTS `locations` (
      `
    idint(11NOT NULL AUTO_INCREMENT,
      `
    titlevarchar(250NOT NULL,
      `
    descriptiontext,
      `
    timestamptimestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      
    PRIMARY KEY (`id`)
    ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=201 

    tabella voti utenti


    Codice PHP:

    CREATE TABLE 
    IF NOT EXISTS `locations_rates` (
      `
    idint(11NOT NULL AUTO_INCREMENT,
      `
    id_locationint(11NOT NULL,
      `
    uidint(50NOT NULL,
      `
    rateint(1NOT NULL,
      
    PRIMARY KEY (`id`)
    ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=

    Grazie infinite!!
    Iceberg

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469

    Re: [MySQL] collegamenti tabelle

    Originariamente inviato da iceberg
    Ciao, ho due tabelle(...)
    Cominciamo col dire che hai due engine diversi, il che in generale è male, o meglio è bene se sai perchè sono diversi.
    Inoltre usano utf8, il che, nuovamente, può essere bene o male a seconda dei casi
    (...)
    se l'utente non ha apportato voti all'elemento mi basta che user_rate sia NULL (ovviamente non zero)
    Anche qui user_rate non è un campo, dovrai usare un AS (non è così grave).
    Per rispondere alla tua domanda ti server un join di tipo "particolare" (per modo di dire), ossia che riporti SEMPRE tutte le righe a sinistra, e che a "destra" metta null se non sono trovate.
    Per capirci non puoi usare qualcosa del genere
    codice:
    ... from tabella1,tabella2 where tabella1.id=tabella2.id
    Come devi fare? Non te lo dico ( )... come faresti?
    (altro dubbio: come posso evitare che nella secoda tabella ci siano due voti da parte di un utente sullo stesso elemento?? dovrei impostare come chiave primaria id_location e uid?? oppure altro?)
    Dipende.
    Ovvero se è da vietare che siano inseriti più voti, oppure no.
    Se uno può dare uno (ed un solo) voto puoi imporre il "blocco" nel db definendo una chiave UNIVOCA sul campo.
    Questo però richiederà, lato applicazione, di verificare che l'inserimento di un voto non causi un errore (rispondendo qualcosa tipo "birichino non puoi votare più volte!)

    Se, al contrario, uno può votare più volte => c'è poco da fare

  3. #3
    perchè dici che utf8 può essere anche un male?? io l'avevo impostato volutamente, sperando di risolvere prolemi con accenti ed altro....

    per quanto riguarda la mia query, ovviamente dovrò utilizzare un AS

    immagino una LEFT OUTER JOIN

    ma poi mi blocco

    non so come gestire questo campo che in alcuni casi può essere valorizzato ed in altri no

    Iceberg

  4. #4
    Nothing??
    Iceberg

  5. #5
    ho provato con


    SELECT
    L.title
    , L.description
    , R.rate
    FROM
    locations L
    LEFT OUTER JOIN locations_rates R ON L.id = R.id_location
    WHERE uid=111



    ma in questo modo, passando l'uid (cosa che a me serve) non ottengo tutti i record e "solo" in campo rate valorizzato nel caso in cui l'utente abbia votato

    ma trovo i record filtrati per l'utente ... quindi solo quelli con voti da parte dell'utente


    dove sbaglio?

    Grazie
    Iceberg

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    non ci ho capito un granchè, non era quello che volevi?

    Suggerimento: dumpa struttura e (un pezzo) del db, metti i risultati che vuoi ottenere

  7. #7
    il risultato che voglio ottenere è, passando un come parametro uid dell'utente

    visualizzare:

    tutti i records della tabella locations (sempre, anche se un utente non ha votato)

    una colonna user_rate con il valore NULL se non è presente nessun record (voto) nella tabella locations_rates oppure il valore del voto inserito dall'utente se è presente un record
    Iceberg

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.