Avatar billede showsource Seniormester
28. marts 2015 - 07:32 Der er 9 kommentarer og
2 løsninger

Fjerne evt. duplikater

Hej
Har en tabel,
id, dato, tid_id, tjener_id
Fx:

1 2015-03-28 1 6
2 2015-03-28 1 6
3 2015-03-28 2 3
4 2015-03-29 3 2
5 2015-03-29 1 6
6 2015-03-29 1 6

Her vil jeg gerne fjerne id fx. 1 og 5 eller 2 og 6
Avatar billede showsource Seniormester
28. marts 2015 - 07:53 #1
Hvad jeg har prøvet med indtil videre:

SELECT t1.id FROM vagtplan as t1
LEFT JOIN (vagtplan AS t2) ON
(t2.dato = t1.dato AND t2.tid_id = t1.tid_id  AND t2.tjener_id = t1.tjener_id AND t2.dato BETWEEN '2015-03-01' AND '2015-03-31')
GROUP BY t2.dato, t2.tjener_id, t2.tid_id ORDER BY t1.id ASC

Den henter alle "unikke" rækker.
Vil kun ha' dem som IKKE bliver vist.
28. marts 2015 - 10:19 #2
Nu er det nogen tid siden jeg selv har rodet med mysql, men det må vel dreje sig om at ændre arbejdsmåden, så der for fremtiden ikke kommer duplikater i tabellen og derefter foretage en oprydning.  Det kunne jo gøres ved at lave en ny tabel vagtplan1 og så flytte alle unikke værdier der over, såsom (ikke testet)

INSERT INTO vagtplan1(dato, tid_id, tjener_id)
SELECT DISTINCT dato, tid_id, tjener_id FROM vagtplan
Avatar billede vagnk Juniormester
28. marts 2015 - 14:41 #3
Dette er osse skrevet ud fra hukommelsen, så måske skal du rette det lidt.


SELECT t1.id, t1.dato, t1.tid_id, t1.tjener_id, t2.tjener_id
FROM vagtplan t1
JOIN vagtplan t2
ON t2.id > t1.id
WHERE t1.dato = t2.dato
AND t1.tid_id = t2.tid_id
AND t1.tjener_id = t2.tjener_id
ORDER BY t1.id;

Ideen er at joine tabellen med sig selv på id (som sæføli er UNIQUE).
Hvis den yngste eller ældste skal bibeholdes sorterer du bare faldende eller stigende efter behov.

Som osse Christian_Belgien er inde på er det en god ide at undgå det i fremtiden. Sæt UNIQUE INDEX på dato, tid_id og tjener_id.
Avatar billede showsource Seniormester
29. marts 2015 - 09:07 #4
Ja, selvf. skal t2.id være større !!! ( total tanketorsk )
Og dit ex. virker !

"Sæt UNIQUE INDEX" forstår jeg ikke helt.
Hvis en kolonne bliver UNIQUE kan der jo ikke være flere rows med samme værdi?
Jeg bruger INDEX på dato, tid_id og tjener_id
Og id er selvf. AUTOINCREMENT, PRIMARY

Problemet er ikke så stort.
Det er et "lukket" system jeg har lavet, hvor der reelt kun er en som bruger det.
Og den eneste fejl han har oplevet, er hvis serveren er lidt tid om at svare, er han kommet til at submitte indsættelse af faste vagter to gange, og derfor fået duplikater.
Det er så de rows jeg gerne vil gi' ham mulighed for at slette på en gang.
Query blev så til:

DELETE FROM t1 USING vagtplan as t1
JOIN vagtplan as t2
ON t2.id > t1.id
WHERE t1.dato = t2.dato
AND t1.tid_id = t2.tid_id
AND t1.tjener_id = t2.tjener_id

Den var sgu lidt kringlet at finde ud af, DELETE med "flere" tabelref

At oprette en "kopitabel" var da også en mulighed, som jeg ikke havde overvejet, men det er ikke nødvendigt her.

Smid et svar begge to, så jeg kan fordele point
29. marts 2015 - 09:25 #5
Svar fra mig.
Avatar billede vagnk Juniormester
29. marts 2015 - 09:34 #6
Hvis en kolonne bliver UNIQUE kan der jo ikke være flere rows med samme værdi?
Nej, og det er netop hele ideen. Med denne vil du aldrig mere få problemet.

ALTER TABLE vagtplan ADD UNIQUE `unik1` (dato, tid_id og tjener_id) COMMENT 'aldrig mere dubletter';
Avatar billede showsource Seniormester
29. marts 2015 - 10:16 #7
Arrghh, var ikke klar at man kunne gøre et row unik !
Og så skal det jo lige være , ikke "og"
Avatar billede showsource Seniormester
29. marts 2015 - 10:17 #8
Super mange tak for hjælp !!!
Avatar billede vagnk Juniormester
29. marts 2015 - 10:27 #9
Hvis han i fremtiden kommer ud for ventetider og trykker to gange vil siden komme ud med en fejl, som du skal behandle korrekt. Jeg kan ikke huske MySQL-fejlkoden for dubletter, men den kan du finde i  MySQL-hjælp.
Metoden er at du ikke returnerer fra indsættelsen før du har et korrekt svar, og giver ham besked hvis du får en fejl med den kode du skal finde ud af.

Held og lykke
Vagn
Avatar billede showsource Seniormester
29. marts 2015 - 10:36 #10
Har jeg lige lavet !
(definerer to vars som tæller op, og ud fra det finder fejlmeddelse)
(
Kan ikke se man med mysqli->prepare kan lave en query som udfører flere inserts på samme tid:
INSERT INTO vagtplan VALUES (NULL,'".$var1."'),(NULL,'".$var2."')(NULL,'".$var3."')
)

Men det er sgu kanont med unikke rows !!!
Avatar billede showsource Seniormester
29. marts 2015 - 10:48 #11
Altså:
INSERT INTO vagtplan VALUES (NULL,?),(NULL,?),(NULL,?)

(hader når jeg får postet "forkert")
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

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