Gå til innhold

[Løst] Hjelp til datatype og query, evnt. alt?


Anbefalte innlegg

Prøver å lagre når en gruppe personer reiser til en plass.

Har planer om å ha 2 tables:

 

personer:

id int, navn text/varchar? (anta ca. 1000 personer)

 

reiser:

id int, plass text/varchar?, personer ?

 

1. Er ikke sikker på hvilken datatype som skal brukes i personer, er det mulig å lagre en liste med tall(personer.id)?

er det evnt. en bedre måte å gjøre dette på?

 

2. Er det en query som kan ta tallene i personer, gjøre de om til navn, så returnere de?

SELET navn FROM database.personer WHERE database.reiser.personer inneholder database.personer.id?

 

Har ikke så mye peiling på dette, untatt helt basic SELECT, CREATE, INSERT, UPDATE og DROP

Endret av stelar7
Lenke til kommentar
Videoannonse
Annonse

Viser et tilsvarende eksempel fra Oracles demo-schema SCOTT:

 

CREATE TABLE DEPT

(DEPTNO NUMBER(2),

DNAME VARCHAR2(14),

LOC VARCHAR2(13) );

 

CREATE TABLE EMP

(EMPNO NUMBER(4) NOT NULL,

ENAME VARCHAR2(10),

JOB VARCHAR2(9),

MGR NUMBER(4),

HIREDATE DATE,

SAL NUMBER(7, 2),

COMM NUMBER(7, 2),

DEPTNO NUMBER(2));

 

For å hente personer fra ansatt-tabellen EMP som hører til i en bestemt avdeling (40) i DEPT:

 

Select

emp.ename Person,

dept.dname Avdeling

from

emp,

dept

where

emp.dno=dept.dno

and

dept.dno=40;

 

Dette er den gamle måten å gjøre det på, finnes en mer moderne syntaks som kanskje er mer meningsfull for deg.

Det kan du lese mer om her:

http://en.wikipedia.org/wiki/Join_(SQL)

 

Håper dette er litt til hjelp...

Lenke til kommentar

Mer spesifikt til ditt eksempel:

CREATE TABLE sted
(stedID NUMBER(2),
stedsNavn VARCHAR(40),
kapasitet NUMBER(4) );

INSERT INTO sted VALUES (10, 'Oslo', 300);
INSERT INTO sted VALUES (20, 'Bergen', 250);
INSERT INTO sted VALUES (30, 'Kristiansand', 100);

CREATE TABLE person
(personID NUMBER(5) NOT NULL,  -- dette er primary key kolonne
personNavn VARCHAR2(50),
stedID NUMBER(2)); 

INSERT INTO person VALUES (1000, 'Per',  10);
INSERT INTO person VALUES (1001, 'Ola',  10);
INSERT INTO person VALUES (1002, 'Lars',  20);

 

Spørring:

 

Select
 person.personNavn ,
 sted.stedsNavn
from
 person,
 sted
where
 sted.stedID=person.stedID
and
 sted.stedID=10;

 

Denne gir deg alle som hører til oslo. Dil du ha alle tar vekk and og det som kommer etterpå.

 

Dette blir veldig generelt, siden du ikke sier noe om hvilken database-plattform du er på.

Det bør jo også legges på Primærnøkkel på begge tabellene, samt Fremmednøkkel på stedID i persontabellen.

 

Håper jeg ikke har gjort for mye feil, begynner å bli en stund siden sist...

Endret av oldis
Lenke til kommentar
SQL> Select
    person.personNavn ,
    sted.stedsNavn
    from
    person,
    sted
    where
    sted.stedID=person.stedID
    and
    sted.stedID=10;

PERSONNAVN      STEDSNAVN
-------------   ------------------------
Per             Oslo
Ola             Oslo

Endret av oldis
Lenke til kommentar

Det er en MySQL database

Problemet med å gi personer en stedID er at de ikke har en plass fra før, de er bare en slags enum

 

 

qXWY5nd.png

 

 

 

Da må du ha 3 tabeller:

Person

Reiser

Reisebestilling (e.l)

Du vil jo gjerne at en person kan ha mange reiser, og du vil at en reise kan ha mange personer.

Endret av oldis
Lenke til kommentar

Det er aldri mer en 60stk. på en reise.

Personer i Reiser tabellen peker til ID i Personer tabellen, ikke til anntall personer.

Ser ikke hvordan det oppsettet jeg har setter en stopper for flere reiser per pers?

(legge inn en ny rad med en annen reise(ID=2, REISEMÅL=Bergen, PERSONER=1 (Per)))

 

Hvorfor trenger jeg den tredje tabellen?

 

Er ingen måte å hente ut navnene med bare de to tabellene?

Endret av stelar7
Lenke til kommentar

En person kan reise til så mange steder de vill

EDIT:

select
 personer.id, personer.name
from
 personer, reiser
where
 FIND_IN_SET(personer.id, reiser.personer);

Det ser ut til å gi med ca. det jeg vil ha.

 

Er det mulig å telle i et set? noe ala. find_in_set men med count?

 

EDIT2:

ser ut til å funke med

cast((select length(set) - length(replace(set, countme, ''))) / length(countme) as decimal(65, 0)) as amount

Endret av stelar7
Lenke til kommentar
Normalisering (av databaser) er en teknikk for å designe tabeller i relasjonsdatabaser slik at man minimerer duplisering av informasjon.

Hvordan hindrer en rekke med duplikat info det at mer duplikat info blir skapt?

Endret av stelar7
Lenke til kommentar

http://no.wikipedia....rste_normalform

 

Der er det jo en rekke med duplikat info, bare at tlf.nr. er endret. Hvorfor er det god praksis?

Normalisering handler om å øke hvilken "form" du er på. Første normalform har masse duplikater, men ved å legge på mer restriksjoner i oppbygningen av databasen kan du ganske enkelt oppnå "tredje normalform" som er den man anbefaler folk å bruke i de fleste tilfeller.
Lenke til kommentar

Siden informasjonen i tabell 2 bare er en peker til tabel 1, så vil det jo være null duplisering?

Bør en ikke lagre arrays i databaser?

Usikker på hvilke tabeller du sikter til.

 

Generelt lagrer du ikke arrays eller lister i en database, eksempelvis å lagre en liste av tall i et databasefelt er som regel noe man ønsker å unngå.

Lenke til kommentar

Jeg kommer til å skrive int hver gang det er snakk om numre, men du vet ca hvor stort hver nummer trenger å være. Du kan sjekke hva slags type du trenger her:

http://dev.mysql.com...eger-types.html

Anbefaler å bruke unsigned med mindre du trenger negative tall.

 

varchar, du må bestemme hvor mange bokstaver som er nødvendig som maks.

 

Personer:

personid (int), fornavn (varchar), etternavn (varchar)

Du bør ha personid som primary key og auto increment.

 

Steder:

stedsid (int), stedsnavn (int), (lengdegrad, breddegrad etc om nødvendig)

 

Reiser:

reiseid (int), fra (int), til (int), tid (int), reisetid (int)

fra og til er linket til stedsid

 

Passasjerer:

passasjerid (int), reiseid (int), personid (int)

 

 

Noe sånt som det her. Du lager en tabell for så og si alt som er et substantiv, og så fyller du inn beskrivende detaljer om det. Hvis du ser noen av detaljene du bruker til å beskrive med trenger å bli beskrevet lager du en ny tabell for det. o.O

 

Håper ikke dette virket for rotete. Ja det er 4 tabeller istedenfor 2, men det er mye lettere å jobbe med de, og du lagrer egentlig ikke mye ekstra informasjon, tvert om, dette fordi du gjenbruker informasjonen.

Endret av MMDE
Lenke til kommentar

Jeg har jo all infoen som trengs i de to tabellene?

Personer har id(int) og fullt navn(varchar).

Reiser har id(int), til(varchar) og reisende(varchar). Fra, når og hvor lenge er irrelevant da det kun er reisemål som skal føres inn.

Endret av stelar7
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...