Theodorl Skrevet 14. november 2007 Del Skrevet 14. november 2007 (endret) 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 15. november 2007 av Theodorl Lenke til kommentar
roac Skrevet 14. november 2007 Del Skrevet 14. november 2007 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 Lenke til kommentar
Theodorl Skrevet 14. november 2007 Forfatter Del Skrevet 14. november 2007 Takk for svar, trooor jeg forstod hvordan det skulle gjøres, men hvordan kan jeg skrive til to forskjellige tabeller samtidig? Lenke til kommentar
roac Skrevet 14. november 2007 Del Skrevet 14. november 2007 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
Theodorl Skrevet 14. november 2007 Forfatter Del Skrevet 14. november 2007 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? Lenke til kommentar
roac Skrevet 14. november 2007 Del Skrevet 14. november 2007 Har vært oppe i 30 timer, så ... litt senere ... eller noen andre gjør Lenke til kommentar
Theodorl Skrevet 14. november 2007 Forfatter Del Skrevet 14. november 2007 Har vært oppe i 30 timer, så ... litt senere ... eller noen andre gjør Få deg litt søvn.. hehe! Ja, sikkert andre som også klarer d.. God natt Lenke til kommentar
Anders Moen Skrevet 14. november 2007 Del Skrevet 14. november 2007 Hva med 2 (eller flere om det er nødvendig) queries etter hverandre? Kan hende det funker med inner join som roac poster, men det har jeg så og si null erfaring med så det holder jeg meg borte fra for nå Lenke til kommentar
Theodorl Skrevet 15. november 2007 Forfatter Del Skrevet 15. november 2007 (endret) 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 15. november 2007 av Theodorl Lenke til kommentar
Frank2004 Skrevet 15. november 2007 Del Skrevet 15. november 2007 (endret) 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 15. november 2007 av Frank2004 Lenke til kommentar
Theodorl Skrevet 15. november 2007 Forfatter Del Skrevet 15. november 2007 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
Manfred Skrevet 15. november 2007 Del Skrevet 15. november 2007 Dette virker som et utrolig elendig databasedesign. Når samme data skal inn i to tabeller, så skal noe slettes fra den ene, osv... Lenke til kommentar
Theodorl Skrevet 15. november 2007 Forfatter Del Skrevet 15. november 2007 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
roac Skrevet 15. november 2007 Del Skrevet 15. november 2007 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
Theodorl Skrevet 15. november 2007 Forfatter Del Skrevet 15. november 2007 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
Igniztion Skrevet 15. november 2007 Del Skrevet 15. november 2007 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
Theodorl Skrevet 15. november 2007 Forfatter Del Skrevet 15. november 2007 (endret) 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 15. november 2007 av Theodorl Lenke til kommentar
Manfred Skrevet 15. november 2007 Del Skrevet 15. november 2007 (endret) SELECT DISTINCT(PersonID), ... FROM oversikt WHERE DATEDIFF(dd,created) < 1 ? Endret 15. november 2007 av Manfred Lenke til kommentar
Theodorl Skrevet 15. november 2007 Forfatter Del Skrevet 15. november 2007 (endret) Hmm... kan litt men...lyst til å forklare hva du mener? Endret 15. november 2007 av Theodorl Lenke til kommentar
Igniztion Skrevet 15. november 2007 Del Skrevet 15. november 2007 (endret) 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 15. november 2007 av IgniZtion Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå