Avatar billede asdffdsa Nybegynder
06. november 2004 - 20:45 Der er 16 kommentarer og
1 løsning

Hjælp til et par joins

Hey, jeg mindes ikke så meget om joins...så jeg håber I kan hjælpe mig med to kald, har ikke tid til at læse om skidtet den her weekend :-/

Har 3 tabeller
- adm_bruger (id primary key, bruger, password)
- adm_rolle (id primary key, rolle)
- adm_bruger_rolle_relation (bruger_id, rolle_id)

Skal lave et kald der henter rolle fra adm_rolle, for en enkelt bruger, vha. søgning på id i adm_bruger. Hvordan gør man det?

Og så et hvor man henter rolle ud fra søgning på bruger og password, how to?
(og bliver der returneret null, hvis den ikke finder brugeren?)
Avatar billede arne_v Ekspert
06. november 2004 - 20:49 #1
SELECT adm_rolle.rolle
FROM adm_bruger,adm_bruger_rolle_relation,adm_rolle
WHERE adm_bruger.id=adm_bruger_rolle_relation.bruger_id AND adm_bruger_rolle_relation.role_id=adm_rolle.id AND
adm_bruger.bruger='frede'
Avatar billede arne_v Ekspert
06. november 2004 - 20:50 #2
Og

  adm_bruger.bruger='frede'

kan vel erstattes med

  adm_bruger.password='frede'

eller

  adm_bruger.id=137

efter behov
Avatar billede asdffdsa Nybegynder
06. november 2004 - 21:09 #3
...men en søgning på _både_ bruger og password, ville så komme til se sådan her ud:
SELECT adm_rolle.rolle
FROM adm_bruger,adm_bruger_rolle_relation,adm_rolle
WHERE adm_bruger.id=adm_bruger_rolle_relation.bruger_id AND adm_bruger_rolle_relation.role_id=adm_rolle.id AND
adm_bruger.bruger='frede' AND adm_bruger.password='12345'
?
Avatar billede arne_v Ekspert
06. november 2004 - 21:10 #4
ja
Avatar billede asdffdsa Nybegynder
07. november 2004 - 00:55 #5
Takker :) Smider du lige et svar?
Avatar billede arne_v Ekspert
07. november 2004 - 09:04 #6
svar
Avatar billede md_craig Nybegynder
07. november 2004 - 21:05 #7
SELECT adm_rolle.rolle
FROM adm_bruger
INNER JOIN adm_bruger_rolle_relation ON adm_bruger_rolle_relation.bruger_id = adm_bruger.id
INNER JOIN adm_rolle ON adm_rolle.id = adm_bruger_rolle_relation.rolle_id
WHERE adm_bruger.bruger='frede' AND adm_bruger.password='12345';
Avatar billede md_craig Nybegynder
07. november 2004 - 21:10 #8
Den skulle også gerne virke, og skulle være en både pænere, mere overskuelig og bedre måde at gøre det på. (Har jeg ladet mig fortælle)... Nok ikke meget bedre i dette tilfælde da du nok har Roller for hver bruger...
Avatar billede arne_v Ekspert
07. november 2004 - 21:13 #9
Funktionelt gør den præcis det samme.

Om den er pænere er en subjektiv vurdering.
Avatar billede md_craig Nybegynder
07. november 2004 - 21:16 #10
arne v >>> Resultatet er det Samme... Men måden det bliver gjort på inde i databasen er så vidt jeg ved ikke det samme... og oplever også at INNER JOIN vs "det andet" er OVER ALL hurgtigere...

Især hvis du har tabeller hvor ikke alle Rows har bindinger...
Avatar billede arne_v Ekspert
07. november 2004 - 21:40 #11
Har du nogen referencer ?

Jeg kan finde 2 som siger ingen forskel:

http://forums.devshed.com/showthread.php?p=511182  (helt nede i bunden)

http://www.sitepoint.com/forums/showthread.php?t=99809
Avatar billede md_craig Nybegynder
07. november 2004 - 23:44 #12
arne v >>> Mine Referencer Bygger Desvære mest på MsSQL...

www.codealloy.com/Advanced%2520SQL%2520Server%2520Performance%2520Tuning.ppt+INNER+JOIN+vs+WHERE&hl=da" target="_blank">http://www.google.dk/search?q=cache:3j6amwuN6uQJ:www.codealloy.com/Advanced%2520SQL%2520Server%2520Performance%2520Tuning.ppt+INNER+JOIN+vs+WHERE&hl=da

For en... En anden ting er at en INNER JOIN virker på følgende måde...

Inner Join
The Inner Join logical operator returns each row that satisfies the join of the first (top) input with the second (bottom) input.

(MSDN: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/optimsql/odp_tun_1_1fla.asp)

Ja... Lige at finde den artikel jeg har læst en gang på MSDN om Database optimering... Ja det er jo en HELT anden sag kan jeg se nu... Da det er ret svært lige at grave frem...

Men uanset hvad Siger en af dine kilder selv:

// both are joins
the first, called "table list" syntax, is old and deprecated
the second, called "join" syntax, is newer, standard, and has several advantages
always use join syntax //

Hvad han siger der er jeg så også helt enig i...
Og må sige at efter en længere søgen på nettet, virker det som om at det er forskelligt fra Database til Database hvordan ting foregår...

ORACLE: http://asktom.oracle.com/pls/ask/f?p=4950:8:::::F4950_P8_DISPLAYID:6585774577187

Ifl. det er der INGEN forskel i behandlingen af en Where/Inner Join...

og efter implementeringen af Store Procedures i MySQL ser det ud til det læner sig op af Oracle (Kan ikke huske hvad deres Syntax heder), Og hvis der så ikke er noget Performence at hente ved ORACLE så er det nok heller ikke sikkert der er i MySQL...
  Kan jeg ikke forsvare...

Mit område er så også mest inden for T-SQL Databaser, (Access, MsSQL, FoxPro osv)
Men Nu har det også fanget min interesse hvor der er forskel, hvor der ikke er... og hvad der er bedst...

Så falder jeg over flere spændende emner... poster jeg dem da lige...
Avatar billede hmortensen Nybegynder
07. november 2004 - 23:49 #13
Når man kigger på hvad et kald koster i mssql's query analyzer, blir resultattet det samme med de her to metoder:

SELECT felt1, felt2
FROM t1
INNER JOIN t2 ON t1.relfelt = t2.relfelt

og

SELECT felt1, felt2
FROM t1, t2
WHERE
t1.relfelt = t2.relfelt
Avatar billede md_craig Nybegynder
08. november 2004 - 00:24 #14
hmortensen >>

Hvis du skal finde noget skal du nok lave det mere komplex...
Uenigheden er STOR på mange andre Forums også...

Fx:
http://www.winnetmag.com/SQLServer/Forums/messageview.cfm?catid=1666&threadid=103707
http://www.winnetmag.com/SQLServer/Forums/messageview.cfm?catid=1666&threadid=108508

OSV...

Nogle leder efter svar, nogle siger det er det samme, nogle siger at Det er forskelligt... Må ærlig indrømme at til trods for hvad jeg har læst gennem tiderne er jeg selv blevet ret så meget i Tvivl... :/...

Stadig er Standpunktet dog at INNER JOIN bør benyttes da det er ny standard (ANSI), i forhold til den gamle metode fra SQL-86... (var vist også den benyttede i SQL-92)
Avatar billede md_craig Nybegynder
08. november 2004 - 00:30 #15
Her står der envidere lidt om Nested-Loop Joins, Merge Joins Hash joins osv...

Som forklare lidt om hvordan de virker... det har dog desvære ikke det store med WHERE vs. INNER JOIN Spørgsmålet... :(
Avatar billede md_craig Nybegynder
08. november 2004 - 09:44 #16
Avatar billede arne_v Ekspert
08. november 2004 - 19:52 #17
Som jeg læser linkene så mener de fleste at der heller ikke er  nogen hastigheds forskel
på MS SQLServer.

Der er rigtigt mange af MS SQLServer brugerne (ligesom blandt MySQL brugerne) som synes
at INNER JOIN metoden giver mere læsbar kode fordi ON står sammen med
tabel navnene og ikke blandet sammen med diverse andre betingelser (og
hvis man glemmer en JOIN WHERE betingelse så kan det jo gå grueligt
galt).
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester