Avatar billede tblaster Nybegynder
15. januar 2005 - 22:14 Der er 21 kommentarer og
1 løsning

Sql strenge

Hejsa

jeg har en database med 2 tabeller:
Data
Kategorier

Bægge tabeller har en følgende 2 kolonner:
ID
ParentID

Det jeg har brug for, er at få en sql streng der kan samligne tabellerne og finde det data i data som ikke har nogen relation til kategori tabellen. Sammenhængen er at ParentID i data høre til ID i Kategorier.

Desuden skal jeg også have en sql streng der henter de kategorier ud som ikke høre til nogen steder. Altså hvor ParentID ikke findes som et ID i Kategori tabellen.

Jeg vil helst hvis jeg kan få de 2 løsninger som en sql streng jeg kan køre direkte i min MySQL database. Hvis dette ikke kan lade sig gøre så skal det gerne laves i asp.

På forhånd tak!
Avatar billede michael_stim Ekspert
15. januar 2005 - 22:37 #1
SELECT d.*,k.* FROM Data d,Kategorier k WHERE k.ID<>d.ID OR k.ParentID<>d.ParentID
Har du ParentID som "foreign key" bytter du bare om på den ene.
Avatar billede arne_v Ekspert
15. januar 2005 - 22:41 #2
SELECT Data.ID
FROM Data LEFT JOIN Kategorier ON Data.ParentID = Kategorier.ID
WHERE Kategorier.ID IS NULL
Avatar billede arne_v Ekspert
15. januar 2005 - 22:42 #3
SELECT d1.ID
FROM Data d1 LEFT JOIN Data d2 ON d1.ParentID = d2.ID
WHERE d2.ID IS NULL
Avatar billede tblaster Nybegynder
16. januar 2005 - 10:44 #4
Yep det virker ... kan I også hjælpe med en sql streng der undersøger om der er 2 ens poster, altså hvis under Data de har samme:
Navn
Tekst
Avatar billede tblaster Nybegynder
16. januar 2005 - 10:53 #5
Og jeg skal også bruge sql strengene som deletes. Jeg kan ikke helt få følgende til at virke:

Delete
FROM  `Data` LEFT  JOIN Kategorier ON Data.ParentID = Kategorier.ID
WHERE Kategorier.ID IS  NULL
Avatar billede arne_v Ekspert
16. januar 2005 - 19:04 #6
SELECT d1.ID,d2.ID,d1.Navn,d1.Tekst
FROM Data d1,Data d2
WHERE d1.Navn=d2.Navn AND d1.Tekst=d2.Tekst AND d1.ID<>d2.ID
Avatar billede arne_v Ekspert
16. januar 2005 - 19:05 #7
Hvis du bruger MySQL 4.1 så kan du:

DELETE FROM Data WHERE ID IN (SELECT ...)
Avatar billede tblaster Nybegynder
16. januar 2005 - 22:50 #8
Jeg bruger MySQL 4.0.17 og phpMyAdmin 2.5.6.


Kan ikke lige se hvordan jeg kan kæde den delete du skrev sammen med følgende:
Delete  FROM `Data` LEFT JOIN Kategorier ON Data.ParentID = Kategorier.ID WHERE Kategorier.ID IS  NULL

Og din sql der samligner for ens data er jeg ved at teste men det lader ikke til den virker. Nu har den tygget på det i flere minutter uden at give noget resultat. Er det normalt?
Avatar billede arne_v Ekspert
16. januar 2005 - 22:54 #9
DELETE FROM Data WHERE ID IN
(SELECT Data.ID
FROM Data LEFT JOIN Kategorier ON Data.ParentID = Kategorier.ID
WHERE Kategorier.ID IS NULL)

o.s.v.
Avatar billede arne_v Ekspert
16. januar 2005 - 22:54 #10
Hvis der er mange rækker i tabellen, så kan den godt tage lang tid.
Avatar billede tblaster Nybegynder
16. januar 2005 - 22:59 #11
Det giver følgende fejl med din delete:

MySQL returnerede:
#1064 - You have an error in your SQL syntax.  Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT Data.ID
FROM  DATA  LEFT  JOIN Kategorier ON Data.Parent

der er over 20.000 ...
Avatar billede arne_v Ekspert
16. januar 2005 - 23:08 #12
Ja fordi den som skrevet krævet 4.1 og du kører 4.0.


Der skal du igang med en join i seleve DELETE FROM.

Hvilken fejl fik du på den du har forsøgt med (10:53:12) ?
Avatar billede tblaster Nybegynder
16. januar 2005 - 23:12 #13
Den spørger fint nok om jeg vil slette men kommer så med samme nr-fejl:

MySQL returnerede:
#1064 - You have an error in your SQL syntax.  Check the manual that corresponds to your MySQL server version for the right syntax to use near 'LEFT  JOIN Kategorier ON Data.ParentID = Kategorier.ID WHERE Ka
Avatar billede arne_v Ekspert
16. januar 2005 - 23:15 #14
Prøv:

DELETE
FROM  Data
USING Data LEFT JOIN Kategorier ON Data.ParentID = Kategorier.ID
WHERE Kategorier.ID IS  NULL
Avatar billede tblaster Nybegynder
16. januar 2005 - 23:26 #15
Så melder den ingen fejl men står bare og tænker. Har ladet den stå i 10 min nu uden at der sker noget. Det er ikke godt! Tror heller ikke sql serveren kan lide det.

Udtrækket med en ren select tager 1 sek og henter 1302 poster ud. Det skal ikke tage meget længere at slette del eller hvad?

Kan jeg slette dem med en anden select?
Avatar billede arne_v Ekspert
16. januar 2005 - 23:29 #16
Har du index på ParentID kolonnerne ?
Avatar billede tblaster Nybegynder
16. januar 2005 - 23:34 #17
nope ... nu har jeg trykket på index udforan id og parentid så de er tilføjet under indekser. Skal jeg gøre mere og eller andet og så teste igen?

Hvad gør et indeks?
Avatar billede arne_v Ekspert
16. januar 2005 - 23:36 #18
De vil muligvis gøre de joins hurtigere.
Avatar billede tblaster Nybegynder
16. januar 2005 - 23:39 #19
Men en delete skal vel ikke tage meget længere end en select. Der må være et eller andet galt. Hvad kan vi lige gøre ved den?

Jeg kan se at den sql der undersøger for ens data virker hvis jeg bruger den på en mindre tabel. Men den tager da uendelig langtid på min kæmpe data tabel. Kan den optimeres på nogen måde?
Avatar billede arne_v Ekspert
16. januar 2005 - 23:57 #20
Jo - en delete kan godt tage længere tid end en select. Men burde dog ikke være
så mange gange mere.

Korrekte index er nok det bedste du kan gøre for at forbedre hastigheden.
Avatar billede arne_v Ekspert
25. februar 2005 - 22:20 #21
OK ?

Og et svar fra mig
Avatar billede tblaster Nybegynder
25. februar 2005 - 22:38 #22
Takker for hjælpen!
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