Avatar billede orpheus Nybegynder
01. april 2008 - 11:23 Der er 18 kommentarer og
1 løsning

Store problemer med udformning af MySql database

Hej, tak fordi at du gider at kigge på det. Det store problem er hvordan jeg skal opsætte min tabeller i MySql.

Jeg har en liste med navne og telefonnumre:


tel    navn
tel1    navn1
tel2    navn2
tel3    navn3
tel4    navn4
tel5    navn5



De skal bruges af en gruppe mennesker, som skal kunne tilføje (og slette) dem til deres private liste:

bruger
bruger1
bruger2
bruger3
bruger4
bruger5


Så, nu det svære (for mig): Hvordan skal databasen sættes op?

Hvis jeg kører det hele i en tabel med unikke rækker:

bruger    tel    navn
        tel1    navn1
        tel2    navn2
        tel3    navn3
        tel4    navn4
        tel5    navn5
bruger1    tel2    navn2
bruger1    tel4    navn4
bruger2    tel2    navn3
bruger2    tel5    navn5

Rækkerne uden bruger id er de unikke numre/navne som ikke må kunne slette, men skal kunne redigeres af alle brugere. Hvordan ville jeg skulle kalde de numre/navne som er feks på bruger1 liste OG dem som ikke er på hans liste (og stadig skal kunne sorteres efter tel, navn osv), så resultatet bliver som:

select * from TABLE where bruger = bruger1 and/or…

resultat for bruger1:
tel1    navn1    nej
tel2    navn2    ja
tel3    navn3    nej
tel4    navn4    ja
tel5    navn5    nej

Eller vil løsningen være 2 tabeller og bruge join? Og hvordan så det?

Den har virkelig holdt mig søvnløs, så jeg håber at nogen kan hjælpe…

Pft

Jimmy

PS Synes nok at den er mere end 200 værd
Avatar billede sherlock Nybegynder
01. april 2008 - 12:30 #1
du skal bruge en mange-til-mange relation.

tlf-tabellen skal have en ID på.
(tlfID, tel, navn)

Og bruger-tabellen skal have en ID på.
(brugerID, bruger)

Og så skal du lave en relations-tabel med de 2 ID'er i.

(tlfID, brugerID)

For at knytte en bruger til et telefonnummer, indsætter du så bare en række i relationstabellen.
Avatar billede orpheus Nybegynder
01. april 2008 - 13:52 #2
Hey Sherlock. Hvordan trækker jeg så informationerne ud, hvis jeg vil have alle numrene ud for feks bruger1 så jeg får resultat:

resultat for bruger1:
tel1    navn1    nej
tel2    navn2    ja
tel3    navn3    nej
tel4    navn4    ja
tel5    navn5    nej
Avatar billede sherlock Nybegynder
01. april 2008 - 14:34 #3
select * from tlf, bruger, relation
where tlf.tlfid      = relation.tlfID
  and bruger.brugerID = relation.brugerID
  and bruger.bruger  = 'bruger1'
Avatar billede orpheus Nybegynder
01. april 2008 - 15:14 #4
ok, men viser den ikke kun de numre som bruger1 har? Den skal også vise hvilke numre bruger1 IKKE har, så bruger1 evt. kan tilføje dem sin liste:

tel1  Er ikke tilføjet
tel2  Er tilføjet
tel3  Er ikke tilføjet
tel4  Er tilføjet
tel5  Er ikke tilføjet
Avatar billede sherlock Nybegynder
01. april 2008 - 15:40 #5
Det har du ret. Nu har du strukturen.

For at give dig den rigtige sql, skal jeg selv lige have fingre i en mysql.
Det har jeg først i aften.
Avatar billede orpheus Nybegynder
01. april 2008 - 15:46 #6
ok, jeg prøver at rode lidt med det, burde det ikke virke med:

select * from tlf, bruger, relation
where tlf.tlfid      = relation.tlfID
  and bruger.brugerID = relation.brugerID

…og jeg så smider en if ind ala if ($brugerid == 'bruger1) {print "ja";} else {print "nej";}
Avatar billede sherlock Nybegynder
01. april 2008 - 16:04 #7
Nej. Så får du stadig kun de tilknyttede tlf-nr.

Du skal bruger en outer join.
Avatar billede orpheus Nybegynder
01. april 2008 - 16:06 #8
ok, jeg tror jeg bliver nødt til at vente til i aften så :)

Tak, indtil videre…
Avatar billede sherlock Nybegynder
01. april 2008 - 19:49 #9
select bruger, navn, tel
from  tlf
left outer join relation on tlf.tlfID = relation.tlfID
left outer join bruger on bruger.brugerID = relation.brugerID
      and bruger.bruger = 'bruger1'
Avatar billede orpheus Nybegynder
01. april 2008 - 20:55 #10
Ok, så langt, så godt :-)
Det ser ud til at den printer alle relationer fremfor alle tlf.numre

INSERT INTO `tlf` (`tlfid`, `tlf`, `navn`) VALUES
(1, 'tlf1', 'navn1'),
(2, 'tlf2', 'navn2'),
(3, 'tlf3', 'navn3'),
(4, 'tlf4', 'navn4');

INSERT INTO `bruger` (`brugerid`, `bruger`) VALUES
(1, 'bruger1'),
(2, 'bruger2'),
(3, 'bruger3'),
(4, 'bruger4');

INSERT INTO `relation` (`relationid`, `tlfID`, `brugerID`) VALUES
(1, '1', '2'),
(2, '1', '3'),
(3, '2', '1'),
(4, '2', '3'),
(5, '3', '1'),
(6, '4', '4');


OUTPUT:
navn1 (tlf1)
navn1 (tlf1)
navn2 (tlf2) bruger1
navn2 (tlf2)
navn3 (tlf3) bruger1
navn4 (tlf4)
Avatar billede sherlock Nybegynder
01. april 2008 - 22:29 #11
Der har du faktisk resultatet. Du har listet alle tlf-numrene og der hvor du får returneret brugeren, skal der stå Ja. Ellers er det et Nej.
Avatar billede sherlock Nybegynder
01. april 2008 - 22:31 #12
Og dog. Vent lidt :)
Avatar billede orpheus Nybegynder
01. april 2008 - 22:34 #13
Ja, den er der ikke heeelt endnu, men næsten. Der kommer 6 resultater selvom der kun er 4 telefonnumre.
Avatar billede sherlock Nybegynder
01. april 2008 - 23:16 #14
Måske er jeg træt eller også kan det ikke gøres simplere ?!?!?!?

select tel, navn, 'Ja' as "Har nummer"
from  tlf
left outer join relation on  relation.tlfID = tlf.tlfID
join bruger on bruger.brugerID = relation.brugerID
and bruger.bruger = 'bruger1'
union
select tel, navn, 'Nej'
from  tlf a1
where a1.tlfID not in(
    select a2.tlfID
    from  tlf a2
    left outer join relation on  relation.tlfID = a2.tlfID
    join bruger on bruger.brugerID = relation.brugerID
    and bruger.bruger = 'bruger1')
order by 1, 2
Avatar billede orpheus Nybegynder
01. april 2008 - 23:48 #15
Shit, har du lige skrevet det? Hardcore! Det fylder godt nok noget mere end det jeg bruger nu:

$User = 1;
$Get = mysql_query("select * from tlf");
while ($ROW = mysql_fetch_array($Get)) {
$tlfid = $ROW[tlfid]; $tlf = $ROW[tlf]; $navn = $ROW[navn]; $bruger = $ROW[bruger];
    $Count = mysql_result(mysql_query("select count(relationid) from relation where brugerID = '$User' and tlfID = '$tlfid'"),0);
    if ($Count != 0) {print "Ja";} else {print "Nej";}
        }
Avatar billede orpheus Nybegynder
01. april 2008 - 23:51 #16
Er det helt umuligt at bruge?
Avatar billede sherlock Nybegynder
01. april 2008 - 23:54 #17
Næh. Nu er jeg ikke til PHP, men hvis en ting virker, så virker den :)
Avatar billede orpheus Nybegynder
01. april 2008 - 23:56 #18
Hehe, sandt! Mange tak for indsatsen. Smid et svar :)
Avatar billede sherlock Nybegynder
02. april 2008 - 07:40 #19
:)
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