[MySQL] Fetch missing IDs

Pagina: 1
Acties:

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 21-02 23:50
Ik heb een tabel met AutoIncrementing IDs. Hetis de bedoeling dat er niets uit de database wordt verwijderd, waardoor de IDs dus allemaal erin blijven staan. Maar, als ik mijn systeempje (Forum) straks aan anderen ga geven,dan heb je vast mensen ertussen die wel zo dom zijn om dingen uit de database te verwijderen.

Wat ik nu dus nodig heb, is om in mijn PHP code een array te verkrijgen met de missende IDs.

voorbeeld:

ID naam
1 bla
2 blaa
4 blaaaa
6 blaaaaaa

nu wil ik dus '3' en '5' terug krijgen van mijn query. Ik heb geen flauw idee hoe ik dit voor elkaar moet krijgen in MySQL. Iemand enige ideeen?

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • Duinkonijn
  • Registratie: Augustus 2001
  • Laatst online: 15:38

Duinkonijn

Huh?

for (a=0 | a != 300000 | a++) {
if id.tabel[a] not exist then print("nr ",a,"ontbreekt");
}

zo iets? een beetje debuggen enz.

wat je ook kan doen is niet toe staan om te verwijderen... moven naar trash...
zoals hier

[ Voor 32% gewijzigd door Duinkonijn op 01-05-2003 03:48 ]

Het is makkelijk om iemand zijn negatieve eigenschappen te benoemen, maar kan je ook de positieve eigenschappen benoemen?


  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

In MySQL krijg je dit niet voor elkaar tenzij je een tabel hebt waarin alle mogelijk ID's staan.
Wat je wel zou kunnen doen is zoeken naar alle records waarvoor een record met ID+1 niet bestaat. Dan krijg je minimaal een idee waar de gaten zitten.

edit:
dusty is op missionaris pad: how to make a good programmer

[ Voor 15% gewijzigd door Goodielover op 01-05-2003 08:57 . Reden: reactie op dusty toegevoegd ]


  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Een betere vraag: Waarom zou je dat willen?

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Verwijderd

Dan kan hij de mensen erop aanspreken geen dingen meer te verwijderen? >:)

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 21-02 23:50
Dusty> omdat ik er vanuit ga dat er geen missende ID's zijn in die tabel. Omdat door user-intervention dat dus wel kan gebeuren, wil ik weten welke ID's verwijdert zijn, om dit verder af te kunnen handelen.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Verwijderd

Een extra stukje code maken bij het runnen van de DELETE query die opslaat welk id ie weggooid?

Of alle ID's in een array zetten, en dan met een for loop van 1 tot [grootste id] met in_array() controleren.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$ID = array();
$missing = array();
$i=0;

// Zet alle ID's in de $ID array
// ...
// Haal het hoogste ID op: (thxs Obliterator)

$query = "SELECT MAX(ID) FROM tabel"

// Zet het resultaat in $ID_max
// Controleer alles nu:

for( $a=1; $a<=$ID_max; $a++ )
{
    if( !in_array( $a,$ID ) )
    {
        // ID $a bestaat niet
        $missing[$i]=$a;
        $i++;
    }
}
 
// Nu staan alle ID's die verwijderd zijn in de $missing array
print_r( $missing );

[ Voor 92% gewijzigd door Verwijderd op 01-05-2003 11:24 ]


  • Obliterator
  • Registratie: November 2000
  • Laatst online: 22-08 11:32
Het lijkt me echt een afhankelijkheid die je dus NIET in je code wilt hebben. Het hele idee van autoincrement is nou juist dat je er niet naar om hoeft te kijken en toch een uniek nummer hebt.

Misschien kun je uitleggen waarom je aanneemt dat er geens ID's missen?

PS: de Maximale ID kun je in MySQL volgens mij makkelijker (efficienter) vinden door de query:
code:
1
SELECT MAX(ID) FROM tabel;

[ Voor 22% gewijzigd door Obliterator op 01-05-2003 11:18 ]


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Grijze Vos:
Dusty> omdat ik er vanuit ga dat er geen missende ID's zijn in die tabel. Omdat door user-intervention dat dus wel kan gebeuren, wil ik weten welke ID's verwijdert zijn, om dit verder af te kunnen handelen.
Dan moet je je misschien afvragen waar ID's eigenlijk voor zijn ;)

ID's zijn voor identificatie voor het record in de database. Dit om relaties te leggen, en om in je programmatuur duidelijk te hebben "over welk record je het hebt". Je moet daar dus ook geen enkele semantische betekenis aan geven, want dan gebruik je het ID voor andere zaken dan waarvoor het bedoeld is, en kan je dus tegen beperkingen aanlopen. Als je tegen zo'n beperking aanloopt is het dus verstandig je af te vragen waarom zo'n "beperking" er eigenlijk is, gevolge de gedachte waarom je het dan niet op die manier op moet lossen.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 21-02 23:50
Ik zal even uitleggen wat het idee hierachter is, misschien dat jullie dan je meer kunnen focussen op de vraag, dan op mijn manier van aanpak.

Ik zit dus met het een tabel met posts van mijn forum, nu wil je ook een functie gebruiken om te kijken of je een bepaald draadje wel/niet hebt gelezen. Ik heb gekozen om bij te houden welke posts een user al gelezen heeft. Dit slaat ie op in de user session, in een array. Zitten nog wat kleinigheden in, om dit array niet al te groot te laten worden. Bijvoorbeeld: het eerste element van het array, geeft aan dat alle posts met een lager ID al gelezen zijn. Als dan bijvoorbeeld mijn array begint met 1,2,3,4,7,8,9 dan kan dat dus vervangen worden door 4,7,8,9. Ik wilde absoluut niet de "gelezen-status" verbinden met de tijd oid, want naar mijn mening, moet een post pas gemarkeerd worden als gelezen, als je hem daadwerkelijk leest, of expliciet aangeeft, dat je hem gelezen hebt. (dmv een "mark read" functie uiteraard).

Nu werkt dit alles prima, ook boards waar je geen access op hebt, markeer ik gelezen, zodat het array niet mega groot wordt.

Alleen, stel dat er nou een ID missing is, dan kan ie die nooit updaten, dus ik moet een routine hebben die dat even voor me naloopt. Duidelijk genoeg zo? Overigens is het niet mijn bedoeling om hier mijn ontwerpsbeslissingen onder de loep te nemen, als ik daar vragen over heb, stel ik die wel. Aangezien we hier aannemen dat iedereen voldoende research zelf doet, alvorens een vraag te stellen, mogen jullie ook aannemen dat ik echt wel heb nagedacht over hoe ik mijn systeem opzet.

Nou, terug naar het probleem, ik heb enkele ideeen nog in mijn hoofd zitten:
1. Maak een tijdelijke tabel aan, met alle IDs in de betreffende range, maak een join met de post-tabel, met een NOT IN/ NOT EXIST van de post tabel. (dit werkt, maar is heel ranzig.)
2. Pak gewoon alle ID's in de range, en laat php maar uitvogelen welke missing zijn. (misschien wel de beste oplossing).
3. Pak de missing ID's uit wat je in de session hebt taan, en check of deze wel echt in de database zitten (en dus gelezen kunnen worden). (enigzins goeie optie, maar dan moet hier wel een verdomd goeie pre-conditie aan vast zitten, anders kan dit wel veel overhead meebrengen).

Belangrijk is uiteraard, wat brengt de minste overhead mee. Ik denk zelf de tweede, en zal dat zo maar eens gaan proberen... Als iemand anders nog ideeen heeft over een vierde oplossing.. graag..

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Ik zou inderdaad voor optie 2 gaan dan heb je zoiezo maar 1 query nodig waarin je alleen de ID kolom hoeft te selecteren en geen WHERE nodig hebt.

Bij optie 3 zou je teveel queries moeten gaan afvuren om te bepalen welke ID's missen.

It’s nice to be important but it’s more important to be nice

Pagina: 1