[mysql/php] dubbele records in andere tabel

Pagina: 1
Acties:
  • 169 views sinds 30-01-2008
  • Reageer

Onderwerpen


  • ramonp
  • Registratie: Januari 2001
  • Laatst online: 19-09 10:35
Ik heb een tabel tabel en een tabel dubbel deze tabellen hebben beiden de volgende velden:
- id varchar(20) (primary key)
- date
- ip
- en nog een aantal velden

Een tekstbestand wordt uitgelezen en in de tabel tabel wordt geplaatst.

Het is de bedoeling wanneer er een dubbel id wordt gevonden dit record in de tabel dubbel wordt geplaatst.

Alleen wat is de beste en snelste oplossing?
PHP:
1
2
3
4
5
6
7
8
9
10
$sql = "SELECT id FROM tabel WHERE id = '". $id ."'";
$result = mysql_query($sql);
$num_rows = mysql_num_rows($result);
if ($num_rows == 0){
  $sql = "INSERT INTO tabel .... enz...";
}
else {
  $sql = "INSERT INTO dubbel .... enz...";
}
$result = mysql_query($sql);

of
PHP:
1
2
3
4
5
$sql =  "INSERT INTO tabel .... enz...";
if (!mysql_query ($sql)){
  $sql =  "INSERT INTO dubbel .... enz...";
  mysql_query($sql);
}

of is er misschien een nog beter oplossing.

Persoonlijk vind ik de eerste netter, maar die is langzamer.
Er kunnen dagelijks duizenden records bijkomen, dus is het niet de bedoeling dat het traag wordt.
Het gaat om de statistieken van een dnetc proxy.

  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

Ik zou 2 tabellen maken. 1 om de id strings in op te slaan en 1 om de info in op te slaan. Je kan dan info aan een id string koppelen.

ID_table
- id (pk)
- id-string varchar(20)

ID_info_table
- id (pk)
- date
- ip
- id_id-string (fk)
- en nog een aantal velden

En dan in de ID_table het id opslaan. En in de ID_info_table de info linken aan een id.

[ Voor 23% gewijzigd door Brakkie op 17-11-2005 13:00 ]

Systeem | Strava


Verwijderd

De tweede is in ieder geval fouter dan fout. Stel dat de query om (wat voor andere reden dan ook) faalt. Dan word er zonder omkijken direct doorgegaan. Hoewel de tweede manier zowiezo beter is, zou je iets met mysql_errno kunnen proberen.

Zoiets:
PHP:
1
2
3
4
5
6
7
define("MYSQL_ERRNO_DUPLICATE_ID", XXXX); // De juiste code moet je opzoeken!
$sSql = "INSERT INTO tabel .. enz.. enz.";
$rsResult = @mysql_query($sSql);
if(mysql_errno($rsResult) == MYSQL_ERRNO_DUPLICATE_ID) {
  $sSql = "INSERT INTO dubbel .. enz.. enz.";
  mysql_query($sSql);
}

Nogmaals, de @ geeft al aan dat je niet goed bezig bent wanneer je dit toepast :)

[ Voor 4% gewijzigd door Verwijderd op 17-11-2005 13:14 ]


  • ramonp
  • Registratie: Januari 2001
  • Laatst online: 19-09 10:35
@sKiLL4

Dat het niet de juiste manier is weet ik ook, maar het werkt wel.
Ik was ook niet van plan om die oplossing te gebruiken.

Daarom heb ik ook maar een topic geopend :)

@Brakkie

Het idee is op zich wel goed.
Maar hoe laat ik nu de dubbelen zien met bij behorende info?

[ Voor 3% gewijzigd door ramonp op 17-11-2005 13:44 ]


  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

code:
1
2
3
4
5
6
7
8
9
10
SELECT 
        count(ID_info_table.id_id-string) as aantal,
        ID_info_table.date as date,
        ID_table.id-string
FROM 
        ID_info_table 
LEFT JOIN 
        ID_table ON ID_table.id = ID_info_table.id_id-string
GROUP BY
        ID_info_table.id_id-string


Ongetest. :)

[ Voor 9% gewijzigd door Brakkie op 17-11-2005 14:47 ]

Systeem | Strava


Acties:
  • 0 Henk 'm!

  • ramonp
  • Registratie: Januari 2001
  • Laatst online: 19-09 10:35
Ik zal het eens gaan testen.

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Zet een UNIQUE-index op de ID-kolom. Krijg je na een insert de mysql error DUPLICATE KEY, dan weet je dat het record al bestaat en gooi je hem in de andere tabel.
PHP:
1
2
3
4
5
<? 
mysql_query("INSERT INTO tabel .... enz...");
if(strpos(mysql_error(), "duplicate") !== false)
    mysql_query("INSERT INTO dubbel.... enz...");
}

Acties:
  • 0 Henk 'm!

  • ramonp
  • Registratie: Januari 2001
  • Laatst online: 19-09 10:35
Brakkie schreef op donderdag 17 november 2005 @ 14:46:
code:
1
2
3
4
5
6
7
8
9
10
SELECT 
        count(ID_info_table.id_id-string) as aantal,
        ID_info_table.date as date,
        ID_table.id-string
FROM 
        ID_info_table 
LEFT JOIN 
        ID_table ON ID_table.id = ID_info_table.id_id-string
GROUP BY
        ID_info_table.id_id-string


Ongetest. :)
Bovenstaande werkt iig niet.
Ik krijg nu alle records te zien en ik wil alleen de dubbele. Dus als er twee records dubbel zijn wil ik alleen maar de laatste zien.
En als ik een lijst maak van alle records wil ik alleen maar de eerste (met bij behorende info) zien.

Daarom had ik gekozen voor twee dezelfde tabellen. Eerste tabel de unieke records en de tweede tabel de dubbelen. Dat was ook makkelijk uitlezen en weergeven.

Acties:
  • 0 Henk 'm!

  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

En wat gebeurd er dan wanneer er in je 2e tabel ook records dubbel zijn?

Systeem | Strava


Acties:
  • 0 Henk 'm!

  • ramonp
  • Registratie: Januari 2001
  • Laatst online: 19-09 10:35
Brakkie schreef op vrijdag 18 november 2005 @ 12:39:
En wat gebeurd er dan wanneer er in je 2e tabel ook records dubbel zijn?
Dat maakt niet uit.

Het gaat erom dat (er van uitgaande dat ik twee tabellen gebruik) in de eerst tabel unieke blockid's heb staan en op het moment dat er een dubbel bij zou komen dit record in de tweede tabel wordt geschreven.
En dan maakt het niet uit of het blockid al voorkomt in de tweede tabel.
In tabel twee maakt ik gebruik van het veld id die gewoon auto_increment is, het blockid hoeft dan niet meer uniek te zijn.

Het is om de proxy files van dnetc uit te lezen. In zo'n file staan de blocks met hun id die geflusht zijn.
Voorbeeld:
code:
1
2
3
4
2005-04-30 00:58:11,10.0.0.1,jan@jan.nl,CA:F4553941:00000000,1,1,1,90090494,6
2005-04-30 00:58:11,10.0.0.1,jan@jan.nl,CA:F4553940:00000000,1,1,1,90090494,6
2005-04-30 00:58:11,10.0.0.1,jan@jan.nl,CA:F455393F:00000000,1,1,1,90090494,6
2005-04-30 00:58:11,10.0.0.1,jan@jan.nl,CA:F455393E:00000000,1,1,1,90090494,6

CA:F4553941:00000000 is zo'n blockid.

Het kan wel eens voorkomen dat zo'n id dubbel wordt geflusht. Om te achterhalen wie en wanneer daar voor verantwoordelijk was, wil ik dus kunnen achterhalen.
Pagina: 1