Avatar billede nikolajdu Nybegynder
22. oktober 2004 - 01:18 Der er 21 kommentarer og
2 løsninger

Konvertere gamle data til ny database.

Jeg har fået en ældre database med ca 35.000 poster ind af døren og til min store skræk bruges der godt nok et par reference tabeller, men de bruges med tekst fremfor et id.

f.eks gammel stil :

Kategori indeholder
  MELO
  PROM
  ....
 
Country indeholder samme smøre
    usa
    uk
    ....
    ...
 

De skal ændres til at være en id_reference til kategori_id / country_id fremfor kategori_code eller decideret lande tekst.

I feltet 'users' har jeg gjort det at konvertere alle "brugere" til én tabel for sig selv og users i tabellen 'tekst' (kan godt være den samme flere steder) skal så igen referere til de nye id´er.

Nu skal jeg så have opdateret den nye tabel 'tekst' med de nye data. Hvordan bygger jeg en php/mysql der kan gøre dette. Skal jeg trække hver række ud fra tabel_old og derefter lave en ny sql for at finde bruger_id og derefter en for kategori og country og så til sidst indsætte hele molevitten i den nye tabel?

Kan det ikke føres smartere hurtigere?

/Nikolaj :))
Avatar billede Slettet bruger
22. oktober 2004 - 02:39 #1
Måske noget i denne stil

Lav en ny tabel med felterne id og country, hvor id er en normal autoincrement.

INSERT INTO countries (country) SELECT country FROM gammeltabel GROUP BY country

og tilsvarende for de andre uhensigtsmæssige felter. Derefter:

INSERT INTO nytabel (navn,country) SELECT gammeltabel.navn, countries.id FROM gammeltabel, countries WHERE gammeltabel.country=countries.country

Dette skal naturligvis udbygges til at passe med din tabel.
Avatar billede nikolajdu Nybegynder
22. oktober 2004 - 03:04 #2
Countries er nu en samlet liste over alverdens lande - Så jeg skal have konverteret de gamle "tekst" data til id'er. Det samme gælder for users og kategorier som nu også er id'er.

Det betyder at jeg skal lave minimum 5 queries for at indsætte en ny række.

1. hent alle data.
2. Find user og find det nye id
3. Find land og find det nye id
4. Find kategori og find det nye id
5 Smid det hele ind igen

Jeg håbede bare på at der var en lidt nemmere måde. :?)
Avatar billede nikolajdu Nybegynder
22. oktober 2004 - 03:04 #3
Hvad gør din GROUB BY egentligt?
Avatar billede Slettet bruger
22. oktober 2004 - 04:20 #4
Den sørger for at der kun kommer et resultat for hvert land.

Og arbejdsgangen er nærmere:

1: Lav en ny tabel for land
2: Lav en ny tabel for kategori
3: Lav en ny tabel for user
4: Saml det hele i en ny tabel.
Avatar billede majkat Nybegynder
22. oktober 2004 - 08:06 #5
Der er ingen grund til at lave nye tabeller - tag de gamle, og lave en

  ALTER TABLE tabelnavn ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST

For referencerne skal du gøre noget i retning af

  ALTER TABLE user DROP PRIMARY KEY

  ALTER TABLE user ADD country_id INT UNSIGNED NOT NULL PRIMARY KEY

  UPDATE user, countries SET user.country_id = countries.id WHERE user.country_tekst =
        countries.country_tekst

  ALTER TABLE user DROP country_tekst

- hvor country_tekst er kolonnen med tekst-repræsentationen af landet.

- og tag lige at vent med det der DROP indtil du er helt sikker på tingene virker... :-)

UPDATEn kommer lidt an på præcist hvordan tingene er defineret - se evt. dokumentationen http://dev.mysql.com/doc/mysql/en/UPDATE.html
Avatar billede nikolajdu Nybegynder
22. oktober 2004 - 10:32 #6
sandbox - 1,2,3 har jeg gjort. Det er 4 jeg beskriver ovenfor.

nye tabeller ja tak. Jeg skal jo skille tingene af da den database jeg fik ind af døren skal passe ind i et andet system. Der bruges land, bruger_id og kategori flittigt i samme stil.

Hvordan updaten kan gøres smartere har jeg ikke helt styr på.
Avatar billede Slettet bruger
22. oktober 2004 - 15:49 #7
Den forstod jeg ikke helt?
Avatar billede nikolajdu Nybegynder
22. oktober 2004 - 16:01 #8
: Lav en ny tabel for land // er gjort
2: Lav en ny tabel for kategori // er gjort
3: Lav en ny tabel for user // er gjort
4: Saml det hele i en ny tabel. // mangler hjælp til den smarte query for ikke at komme ud i de 5 jeg beskrev tidligere.
Avatar billede Slettet bruger
22. oktober 2004 - 17:01 #9
Under 123 regnede jeg også at fylde dem med data.

4 består så af følgende trin:

a: lav den nye hoved-tabel
b: fyld data i med en enkelt query i stil med

INSERT INTO nytabel (user_id, country_id, kategori_id, andre, felter)
  SELECT u.id, c.id, k.id, g.andre, g.felter
  FROM gammeltabel AS g, countries AS c, users AS u, kategorier AS k

WHERE
    g.country=c.navn
AND  g.user=u.navn
AND  g.kategori=k.navn
Avatar billede Slettet bruger
22. oktober 2004 - 17:04 #10
Og grunden til at jeg ikke bare UPDATEer den gamle tabel er, at UPDATE først understøtter flere tabeller fra MySQL 4.0.4, og jeg synes egentlig det er bedre at holde dem adskilt.
Avatar billede nikolajdu Nybegynder
28. oktober 2004 - 21:22 #11
Jeg valgte den tunge gang, da jeg ikke kunne få det til at virke, men smid et svar
Avatar billede Slettet bruger
28. oktober 2004 - 23:40 #12
OK, men så skal du beholde halvdelen selv.
Avatar billede nikolajdu Nybegynder
28. oktober 2004 - 23:59 #13
ok godt så, men tak for kigget ihvertilfald :))
Avatar billede Slettet bruger
29. oktober 2004 - 06:40 #14
Var så lidt. Det er altid sjovt at prøve noget, som går lidt ud over de sædvanlige FAQ-spørgsmål.
Avatar billede nikolajdu Nybegynder
29. oktober 2004 - 06:42 #15
Nu du er her har du måske tid til  en anden lille ting så. :))
Avatar billede Slettet bruger
29. oktober 2004 - 06:46 #16
Tjoh, hvis det ikke tager for lang tid. (Eller ikke behøver være med det samme.)
Avatar billede nikolajdu Nybegynder
29. oktober 2004 - 06:56 #17
Det behøver ikke være lige nu. (det er jo tidligt og folk skal hvad de nu skal om morgenen) Det irriterer mig bare. Løsningen er sikkert såre simpel.

Jeg har to søgninger :

SELECT a.product_id,a.product_title,a.product_isbn,a.product_band,a.product_category,a.product_year,DATE_FORMAT(a.product_created, '%d/%m/%Y - %H:%i') AS date,b.band_id,b.band_name FROM products AS a,bands AS b WHERE a.product_title LIKE '%test%' AND b.band_id = a.product_band ORDER BY a.product_title ASC LIMIT 0,200

SELECT a.product_id,a.product_title,a.product_isbn,a.product_band,a.product_category,a.product_year,DATE_FORMAT(a.product_created, '%d/%m/%Y - %H:%i') AS date,b.band_id,b.band_name FROM products AS a,bands AS b WHERE b.band_name LIKE '%test%' AND b.band_id = a.product_band ORDER BY b.band_name ASC LIMIT 0,200

Den ene søger i product tabellen og hiver navn og kunster ud. Fint det virker.

Den anden skal så søge den anden vej rundt. Altså søgning på kunster (som er unik) men så kun give mig én af hver og ikke som nu hvor jeg får listet samme kunstner hvis der er flere produkter med denne.

Tænk over det ellers opretter jeg et nyt spørgsmål hvis det bliver for indviklet.
Avatar billede Slettet bruger
29. oktober 2004 - 07:01 #18
Den skal vel stadig give alle de produkter, som hører til den specifikke kunstner? Eller er du bare interesseret i en liste over kunstnere, som passer på søgningen og som har produkter tilknyttet?
Avatar billede nikolajdu Nybegynder
29. oktober 2004 - 07:02 #19
lige præcis
Avatar billede Slettet bruger
29. oktober 2004 - 07:04 #20
Til hvilken af dem? Den første eller sidste? ;-)
Avatar billede nikolajdu Nybegynder
29. oktober 2004 - 07:08 #21
Det virker som dit første bud. Altså jeg får en liste, men med alle produkter. Jeg skal have en liste med kunstnere, men kun ét produkt ligegyldigt hvor mange der så end må være.
Avatar billede Slettet bruger
29. oktober 2004 - 07:14 #22
Du kan prøve med

GROUP BY b.band_name lige før ORDER BY

(Og det var egentlig mit andet bud, men det er det, der passer på beskrivelsen af, hvad du ønsker.)
Avatar billede nikolajdu Nybegynder
29. oktober 2004 - 07:17 #23
oki tak og god morgen :))
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