Cllegamenti elementi

domenica 03 aprile 2011 - 20.44

dandi.box Profilo | Junior Member

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

CREATE TABLE IF NOT EXISTS `locations` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(250) NOT NULL,
`description` text,
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=201 ;



tabella voti utenti



CREATE TABLE IF NOT EXISTS `locations_rates` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`id_location` int(11) NOT NULL,
`uid` int(50) NOT NULL,
`rate` int(1) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

alx_81 Profilo | Guru

>Ciao, ho due tabelle
ciao

>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
in questo caso dovrai usare una OUTER JOIN. Pensando ad esempio ad una LEFT JOIN, potrai ricavare tutti i record della tabella di "sinistra" indipendentemente dal fatto che esista una relazione effettiva con la tabella di "destra". Nel tuo caso a sinistra metterai la locations e a destra la locations_rates (immagino facendo la join sul il campo id).

>(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?)
direi di sì, in questo caso fare una chiave primaria sui due campi suddetti ti garantisce che, a parità di location non avrai lo stesso rate.

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

dandi.box Profilo | Junior Member

Grazie per la risposta... potresti dirmi come dovrebbe diventare la mia query?

Thanks

dandi.box Profilo | Junior Member

Please help me! :(

alx_81 Profilo | Guru

>Please help me! :(
cerca di aver pazienza, non sempre c'è tempo per rispondere subito
Guarda, prova a vedere se questa è ok:

SELECT L.title , L.description , R.rate FROM locations L LEFT OUTER JOIN locations_rates R ON L.id = R.id_location
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

dandi.box Profilo | Junior Member

Prima di tutto grazie per l'aiuto!!

nella tua query, passando l'ID (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

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



Grazie ancora

alx_81 Profilo | Guru

>ma trovo i record filtrati per l'utente ... quindi solo quelli
>con voti da parte dell'utente
eh beh.. se aggiungi una where filtri tutti i record compresi i null e li elimini dal resultset.
Devi mettere la condizione nella left join

[...] LEFT OUTER JOIN locations_rates R ON L.id = R.id_location AND uid=111

prova così..



--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

dandi.box Profilo | Junior Member

Graaaazie è perfetto!!!

Non avevo mai visto la condizione nella jOIN, utilissima!!

Grazie infinite!!
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5