Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  11 2484
nFF Kjerringa
mabe140's Avatar
SQL 2012 Express er versjonen av SQL jeg bruker, og fra den har jeg en spill server. Men, jeg har et lite spørsmål, som ville gjort dagen min så mye bedre og lettere!

(Blir mye norsk-engelsk her i denne posten, da jeg ikke aner hva SQL uttrykkene er på Norsk.)

Jeg har et script jeg kjører hver dag, som simpelten sjekker hvor mange som er pålogget. Det er et kjempelite SELECT script. Hva jeg prøver å utføre er å få informasjon i fra to Table istede for bare et. Da brukte jeg google, å søkte som bare det for å finne en eller annen Quiry som kan passe.

Link til alle ting jeg har prøvd så langt:


Så for å forklare min database her, så har jeg en database som heter PS_UserData, og det er den databasen jeg skal bruke i løpet av dette scriptet jeg prøver å lage. I denne databasen har jeg to Table som heter dbo.UserLoginStatus og dbo.Users_Master.

Informasjonen jeg vil hente fra de to Table:

dbo.Users_Master
UserUID, UserID, UserIP

dbo.UserLoginStatus=1
LoginStatus

Når jeg prøvde Inner og Outer join scripts, så ble resultatet at alle de som er pålogget spillet (UserLoginStatus - LoginStatus=1) fikk IP adressen til alle brukerne i Users_Master. Og dermed ble det 54000++ rader i dette scriptet, og overhode ikke hva jeg lette etter.

Dette er hva jeg prøver å lage;

Et script som bruker UserLoginStatus og viser all informasjon ifra det, men også vise IP adressen til de som er logget på. IP adressen til de som logger på blir lagret i Users_Masters.

Dette er scriptet jeg har brukt hver dag så langt (som ikke forteller meg IP);

USE PS_UserData
SELECT * FROM dbo.UserLoginStatus
WHERE Loginstatus = 1

Så jeg tenkte at det kan vell ikke være umulig å hente IP adressen til de som er pålogget (LoginStatus=1) slik at når jeg kjører et skript så vil jeg se samme informasjon som i scriptet ovenfor bare med en ekstra row for IP?

Beklager vis jeg forklarer dårlig, men spør meg gjerne så skal jeg prøve å forklare bedre. Eventuellt vise hva som går feil, å hva jeg ønsker å gjøre.
Du bør definere en relasjon med en primærnøkkel (primary key) og fremmednøkkel (foreign key) i tabellene. Da kan du kjøre en inner join mellom tabellene og få ut den relevante informasjonen.

Kode

SELECT um.UserUID, um.UserID, um.UserIP
FROM dbo.Users_Master um INNER JOIN 
        dbo.UserLoginStatus uls ON um.UserUID = uls.UserUID
WHERE LoginStatus = 1
Sist endret av lor3ntz; 9. juni 2013 kl. 20:02.
nFF Kjerringa
mabe140's Avatar
Trådstarter
Sitat av lor3ntz Vis innlegg
Du bør definere en relasjon med en primærnøkkel (primary key) og fremmednøkkel (foreign key) i tabellene. Da kan du kjøre en inner join mellom tabellene og få ut den relevante informasjonen.

Kode

SELECT um.UserUID, um.UserID, um.UserIP
FROM dbo.Users_Master um INNER JOIN 
        dbo.UserLoginStatus uls ON um.UserUID = uls.UserUID
WHERE LoginStatus = 1
Vis hele sitatet...
SUVERENT!! Tusen tusen tusen takk! Du aner ikke hvor mye jeg setter pris på det!!
▼ ... over en måned senere ... ▼
nFF Kjerringa
mabe140's Avatar
Trådstarter
Sitat av lor3ntz Vis innlegg
Du bør definere en relasjon med en primærnøkkel (primary key) og fremmednøkkel (foreign key) i tabellene. Da kan du kjøre en inner join mellom tabellene og få ut den relevante informasjonen.

Kode

SELECT um.UserUID, um.UserID, um.UserIP
FROM dbo.Users_Master um INNER JOIN 
        dbo.UserLoginStatus uls ON um.UserUID = uls.UserUID
WHERE LoginStatus = 1
Vis hele sitatet...
Okey, så denne fungerte utrolig bra, og jeg har prøvd å gjøre dette med andre "table" også, men klarte desverre ikke å få til det resultatet jeg ønsket.

Her er hva jeg har prøvd, men ikke lykktes med.

SPOILER ALERT! Vis spoiler

USE PS_ChatLog
Select um.row, um.useruid, um.charid, um.chattype, um.targetname, um.chatdata, um.mapID, um.chattime
FROM dbo.chatLog um INNER JOIN
PS_GameData.dbo.Chars uls ON um.charID = uls.CharID
WHERE row > = 1


Jeg tror at grunnen til at jeg plages, er fordi at jeg må hente informasjon fra en database til en annen. (Min hele database har 10 "System Database" i seg, så når jeg hopper mellom dem så tror jeg muligens at dette scriptet vist ovenfor ikke fungerer. Så jeg prøvde å "execute" det, og da fikk jeg opp alt den skulle select ifra ChatLog, men CharID ble ikke gjort om til CharName...

SPOILER ALERT! Vis spoiler

Så da tenkte jeg at "Oy, har ikke fortelt sciptet at CharID skal bli til CharName så da omgjorde jeg slutten på det, å nå ser det slik ut:

USE PS_ChatLog
Select um.row, um.useruid, um.charid, um.chattype, um.targetname, um.chatdata, um.mapID, um.chattime
FROM dbo.chatLog um INNER JOIN
PS_GameData.dbo.Chars uls ON um.charID = uls.CharName
WHERE row > = 1

Etter å ha "Exected" dette scriptet, så finner den kunn hva et menneske har sagt, å ikke hva alle har sagt. totalt sett er det nesten 3000 row's i dette "table" og jeg fikk frem 9.


Hvordan skal jeg kunne forklare meg bedre... La meg skrive hva jeg skal ha fra den ene plassen og hva jeg skal ha fra den andre plassen, så kanskje denne posten svarer mer for seg selv... Håper jeg.

Hva jeg skal ha fra PS_chatlog.dbo.ChatLog :
row, UserUID, CharID, charID, ChatType, TargetName, ChatData, MapID, ChatTime

Hva jeg skal ha fra PS_GameData.dbo.Chars :
CharName

Så med andre ord, jeg prøver å få frem hvem som sa hva, uten å måtte finne "CharID" for så å bruke;
[COLOR="Blue"]Select * from dbo.chars
where charID = <navn>[/COLOR]

Det må jo finnes en måte jeg kan få frem begge? Men jeg skjønner det nokk en gang ikke, da jeg ikke er for god med SQL språk.
"Select um.row, um.useruid, um.charid" - men du prøver å joine på um.charID, altså store/små bokstaver i ID. Kanskje det hjelper? Og jeg husker ikke all verdens av SQL, men må du ikke også SELECTe uls.CharID for å kunne bruke denne?
Sist endret av Maol33t; 16. juli 2013 kl. 17:52.
nFF Kjerringa
mabe140's Avatar
Trådstarter
Sitat av Maol33t Vis innlegg
"Select um.row, um.useruid, um.charid" - men du prøver å joine på um.charID, altså store/små bokstaver i ID. Kanskje det hjelper? Og jeg husker ikke all verdens av SQL, men må du ikke også SELECTe uls.CharID for å kunne bruke denne?
Vis hele sitatet...
Godt påeng!
Prøvde disse to nettop:

SPOILER ALERT! Vis spoiler

USE PS_ChatLog
Select um.row, um.useruid, um.chattype, um.targetname, um.chatdata, um.mapID, um.chattime, uls.CharName
FROM dbo.chatLog um INNER JOIN
PS_GameData.dbo.Chars uls ON um.CharID = uls.CharName
WHERE row > = 1

og

USE PS_ChatLog
Select SPAMum.row, um.useruid, um.CharID SPAMum.chattype, um.targetname, um.chatdata, um.mapID, um.chattime, uls.CharName
FROM dbo.chatLog um INNER JOIN
PS_GameData.dbo.Chars uls ON um.CharID = uls.CharName
WHERE row > = 1


Det gikk ikke så bra. Den fant fortsatt kunn de 9 radene som den ene spilleren har sagt. Så jeg prøvde å "Execute" bare

[COLOR="RoyalBlue"]USE PS_ChatLog
Select SPAMum.row, um.useruid, um.CharID SPAMum.chattype, um.targetname, um.chatdata, um.mapID, um.chattime, uls.CharName
FROM dbo.chatLog um INNER JOIN
PS_GameData.dbo.Chars uls ON um.CharID = uls.CharName[/COLOR]

Uten WHERE, og fortsatt samme 9 radene.
Sist endret av mabe140; 16. juli 2013 kl. 17:56. Grunn: grrr postet uten at jeg trykket knappen
Bob Sacamano
John B's Avatar
Jeg har dessverre ikke tid til å sette meg ordentlig inn i problemet du har, men har gjort en testet manuelt først for å sjekke at du finner mer enn 9 matches? Med en INNER JOIN så listes kun rader som har treff i begge tabellene, om du derimot bruker f.eks. en LEFT JOIN så vil du i allefall få alle radene fra dbo.chatLog med i resultatet (men uls.CharName vil være NULL i tilfeller der det ikke finnes en match) -- dette bør da gi deg mer enn 9 rader.
nFF Kjerringa
mabe140's Avatar
Trådstarter
Sitat av John B Vis innlegg
Jeg har dessverre ikke tid til å sette meg ordentlig inn i problemet du har, men har gjort en testet manuelt først for å sjekke at du finner mer enn 9 matches? Med en INNER JOIN så listes kun rader som har treff i begge tabellene, om du derimot bruker f.eks. en LEFT JOIN så vil du i allefall få alle radene fra dbo.chatLog med i resultatet (men uls.CharName vil være NULL i tilfeller der det ikke finnes en match) -- dette bør da gi deg mer enn 9 rader.
Vis hele sitatet...
Tenker du da:

USE PS_ChatLog
Select um.row, um.useruid, um.charid, um.chattype, um.targetname, um.chatdata, um.mapID, um.chattime
FROM dbo.chatLog um LEFT JOIN
PS_GameData.dbo.Chars uls ON um.charID = uls.CharName
WHERE row > = 1

?
For når jeg kjører dette, så konverterer den fortsatt ikke data fra dbo.chars til dbo.chatlog. La meg legge ved screenshots. Enklere å forklare da..

Prøver å forklare med bilder...

http://forbiddenkeep.net/files/pics/1.jpg

På bildet ovenfor så er databasen. å høyre side ser du alle databasene, og da de to jeg trenger informasjon ifra. PS_ChatLog.dbo.ChatLog og PS_GameData.dbo.chars

Her er de to Table jeg trenger informasjon ifra:

PS_ChatLog.dbo.ChatLog
http://forbiddenkeep.net/files/pics/2.jpg

PS_GameData.dbo.chars
http://forbiddenkeep.net/files/pics/3.jpg

Etter å ha Execute Script, så kommer dette resultatet:
http://forbiddenkeep.net/files/pics/4.jpg

På bildet ovenfor så ser du at det er kunn dbo.ChatLog som kommer frem, og alt som skal hentes ifra dbo.Chars kommer ikke frem. Som dere ser på bildet, så viser det all informasjon jeg trenger, men "CharID" er fortsatt et nr istede for et navn.

Jeg er helt håpløs når det kommer til inner, outer, left join og alt som har med dette å gjøre. Så da blir det vanskeligere å forklare. Det blir vell kanskje feil å bruke "INNER JOIN" eller noen "JOIN", siden informasjonen kommer ifra to helt forkjellige databaser?
Bob Sacamano
John B's Avatar
Du må SELECTe feltet du ønsker. En JOIN tar ikke og gjør om på kolonner fra "venstre"-tabellen, de gjør at du kan hente inn kolonner fra andre tabeller, men du må spesifisere hvilke!

Prøv å legge til uls.CharName i SELECTen din, slik at du får

Kode

Select um.row, um.useruid, um.charid, um.chattype, um.targetname, um.chatdata, um.mapID, um.chattime, uls.CharName
Vil du hente flere felter fra dbo.Chars så må du legge til disse i SELECTen på samme måte som CharName.

I tillegg så ser jeg at du i spørringen din bruker små bokstaver, imens kolonnene ellers er definert med en blanding. Regner med at hele basen er case-insensitiv i og med at du ikke fikk noen feilmeldinger om ugyldig kolonne.
nFF Kjerringa
mabe140's Avatar
Trådstarter
Sitat av John B Vis innlegg
Du må SELECTe feltet du ønsker. En JOIN tar ikke og gjør om på kolonner fra "venstre"-tabellen, de gjør at du kan hente inn kolonner fra andre tabeller, men du må spesifisere hvilke!

Prøv å legge til uls.CharName i SELECTen din, slik at du får

Kode

Select um.row, um.useruid, um.charid, um.chattype, um.targetname, um.chatdata, um.mapID, um.chattime, uls.CharName
Vil du hente flere felter fra dbo.Chars så må du legge til disse i SELECTen på samme måte som CharName.

I tillegg så ser jeg at du i spørringen din bruker små bokstaver, imens kolonnene ellers er definert med en blanding. Regner med at hele basen er case-insensitiv i og med at du ikke fikk noen feilmeldinger om ugyldig kolonne.
Vis hele sitatet...
Har prøvd dette nå, og det eneste den gir meg er som du sa, en ny kolonne med "CharName" men alt som kommer inn i den kolonnen, er NULL ... Så jeg ser fortsatt ikke hvem som sa hva, hehe..
Bob Sacamano
John B's Avatar
Nettopp, det var det jeg ville frem til over. Altså, at dersom du bruker en LEFT JOIN og CharName-kolonnen er NULL for alle rader så er det et tegn på at det er noe galt med JOINen din.

Du bruker nå;

Kode

LEFT JOIN
PS_GameData.dbo.Chars uls ON um.charID = uls.CharName
I utsnittet du viser, så er ikke "charID" tilstede, derimot er "charid" det, det samme kan kanskje også gjelde CharName? Uten å kjenne til tabellstrukturen din blir det vanskelig for meg å si hva du skal joine på. I tillegg ville vi kunne ha løst dette på 5 minutter utenfor forumet (det går 1 dag mellom hvert svar).
nFF Kjerringa
mabe140's Avatar
Trådstarter
Sitat av John B Vis innlegg
Nettopp, det var det jeg ville frem til over. Altså, at dersom du bruker en LEFT JOIN og CharName-kolonnen er NULL for alle rader så er det et tegn på at det er noe galt med JOINen din.

Du bruker nå;

Kode

LEFT JOIN
PS_GameData.dbo.Chars uls ON um.charID = uls.CharName
I utsnittet du viser, så er ikke "charID" tilstede, derimot er "charid" det, det samme kan kanskje også gjelde CharName? Uten å kjenne til tabellstrukturen din blir det vanskelig for meg å si hva du skal joine på. I tillegg ville vi kunne ha løst dette på 5 minutter utenfor forumet (det går 1 dag mellom hvert svar).
Vis hele sitatet...
Databasen min er ikke sensitiv for store og små bokstaver. Men sender deg en melding så kanskje du kan hjelpe meg fortere enn en gang om dagen