Gå til innhold

Sette inn/oppdater til to tabeller (oversikt/historie)


Anbefalte innlegg

Hei!

 

Jeg har en liten nøtt..

 

Jeg har to tabeller, oversikt og historie. Hvor oversikt inneholder en fast rekke med navn med forskjellige aktiviteter knyttet til seg og historie skal inneholde en historikk over personene og hvilke aktiviteter de har vært med på. Her tenker jeg at personene kan dubliseres i tabellen, men at aktiviteten er forskjellige etter hvilke aktiviteter de har vært med på.

 

Så er spørmålet mitt; hvordan kan jeg slette/erstatte i tabellen oversikt for å hindre at samme personer ligger to ganger og samtidig legge til samme data i historikk?

 

Glemte en liten ting, jeg bruker PHP og MySql...

 

Mvh Theo :)

Endret av Theodorl
Lenke til kommentar
Videoannonse
Annonse

Synd du ikke bruker MSSQL eller DB2, da hadde det vært veldig enkelt. :)

 

Men, så til problemstillingen. Jeg går ut i fra at du har en primærnøkkel av et eller annet slag, og det du da typisk gjør er å kjøre en delete kommando hvor du joiner tabellen med seg selv på de kolonnene du vil beholde, og sletter de radene hvor iden er forskjellig fra den minste for kriteriet. Fy, dette ble dårlig norsk, vi prøver litt utestet kode i steden:

 

delete tabell

from tabell t1 inner join

(select

kriterie_1,

kriterie_2,

min(id) id

group by kriterie_1, kriterie2

from tabell) t2

on (t1.kriterie_1 = t2.kriterie_1 and t1.kriterie_2 = t2.kriterie_2)

where t1.id != t2.id

 

Med andre ord: Slette alle rader som tilfredsstiller kriterie_1 og kriterie_2 og hvor ikke er like minste id som forekommer blant radene som tilfredsstiller kriterie_1 og kriterie_2; Ganske elegant, i en kommando, og føler meg rimelig sikker på at det både er effektit og funker som det skal. Men ikke like sexy og effektivt som i SQL Server og DB2 da :p

Lenke til kommentar
Takk for svar, trooor jeg forstod hvordan det skulle gjøres, men hvordan kan jeg skrive til to forskjellige tabeller samtidig?

Nja det var det da, det fikk jeg visst ikke helt med meg her. Jeg ser i utgangspunktet to løsnigner: Den ene (beste) er å bruke en trigger for å slette fra den andre tabellen, den andre løsningen er å ha fremmednøkkel med kaskade på sletting, men dette er litt "farlig" da det er en viss fare for å slette "litt" mer enn du ønsker hvis du ikke holder tunga rett i munnen.

Lenke til kommentar
Nja det var det da, det fikk jeg visst ikke helt med meg her. Jeg ser i utgangspunktet to løsnigner: Den ene (beste) er å bruke en trigger for å slette fra den andre tabellen, den andre løsningen er å ha fremmednøkkel med kaskade på sletting, men dette er litt "farlig" da det er en viss fare for å slette "litt" mer enn du ønsker hvis du ikke holder tunga rett i munnen.

 

Kunne du kjapt ha forklart hvordan denne triggerene muligens ville ha fungert?:p

Lenke til kommentar

Fant utav noe av det.. /edit

 

Bare til å kjøre mysql_query to ganger etter hverandre med samme innhold bare endrer på tabellen.

 

mysql_query("INSERT INTO tabell1 (info1, info2) 
VALUES ('$info1', '$info2')");

mysql_query("INSERT INTO tabell2 (info1, info2) 
VALUES ('$info1', '$info2')");

Endret av Theodorl
Lenke til kommentar
Hei!

 

Jeg har en liten nøtt..

 

Jeg har to tabeller, oversikt og historie. Hvor oversikt inneholder en fast rekke med navn med forskjellige aktiviteter knyttet til seg og historie skal inneholde en historikk over personene og hvilke aktiviteter de har vært med på. Her tenker jeg at personene kan dubliseres i tabellen, men at aktiviteten er forskjellige etter hvilke aktiviteter de har vært med på.

 

Så er spørmålet mitt; hvordan kan jeg slette/erstatte i tabellen oversikt for å hindre at samme personer ligger to ganger og samtidig legge til samme data i historikk?

 

Glemte en liten ting, jeg bruker PHP og MySql...

 

Mvh Theo :)

 

Sikker på at dette er beste måte å modellere problemet ditt..?

Endret av Frank2004
Lenke til kommentar

Hva tenker du på?

 

Kom forresten på nå at jeg ikke har kommet frem til det jeg egentlig lurte på, har ikke funnet ut hvordan jeg skal slette de gamle postene i tabellen oversikt.. så kanskje ikke den beste formuleringen på problemet i hendhold til det jeg la ut som løsning, men en passende formulering på det egentlig problemet.

Lenke til kommentar
Dette virker som et utrolig elendig databasedesign. Når samme data skal inn i to tabeller, så skal noe slettes fra den ene, osv...

 

Ja, dere har nok mer peiling på hva som er god databasedesign en det jeg har...

 

Men har dere noe forslag på hvordan det kan løses med en bra design?

Lenke til kommentar

To tabeller, med relasjon (fremmednøkkel) mellom dem, og en prosedyre som i en transaksjon oppdaterer eller setter inn i begge tabellene. Om noe går galt rulles transaksjonen tilbake, og du har fortsatt konsistente data (dvs ikke noe data som mangler tilhørende data i den andre tabellen).

Lenke til kommentar

Hensikten med at jeg har to tabeller er å ha en slags logg over de tingene som blir skrevet inn i oversikten, for å kunne se hver dag hvilke "transaksjoner" som er utført. Oversikten skal kun vise det som er gjeldene, altså siste innlegg av alle personene.

 

Takk for hjelpen roac, skal se om jeg kan få til noe slikt.

Lenke til kommentar

Hvis jeg forstår problemstillingen din vil jeg tro det hadde vært bedre å ha en tabell for alt sammen. I denne tabellen lager legger du til et felt som heter Created som DATE. Dette feltet setter du til GETDATE() når en ny record settes inn og så henter du kun ut de records som har nyeste creation date fra hver person når du skal vise oversikten.

Lenke til kommentar

Hmm.. Hørtes sannelig ikke så dumt ut.. Men hvordan blir den spørringen?

Kan bruke

$date = date('d-m-Y');
mysql_query("SELECT * FROM oversikt WHERE created LIKE '%$date%'");

til å vise de som er blitt lagt inn det siste døgnet, men hvordan hindrer jeg samme person å bli vist to eller flere ganger?

Endret av Theodorl
Lenke til kommentar
Hmm... kan litt men...lyst til å forklare hva du mener?

 

Stygg og ekkel query som helt garantert kan optimaliseres, men har ikke tid nå.

 

SELECT
*
FROM
Tabell
WHERE
PrimaryKey IN (
	SELECT DISTINCT
		T.PrimaryKey
	FROM 
		Tabell T
	WHERE 
		T.Created = (SELECT MAX(Created) FROM Tabell WHERE PersonID = T.PersonID))

Endret av IgniZtion
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å
×
×
  • Opprett ny...