Toon posts:

[sql] verwijderen zonder relaties

Pagina: 1
Acties:

Verwijderd

Topicstarter
hallo mede tweakers,

ik heb een mysql database met een aantal tabellen
de relevante tabellen zijn:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE TABLE `tmp_bestellijst` (
  `bestel_id` int(255) NOT NULL auto_increment,
  `persoon_id` int(255) NOT NULL default '0',
  `materiaal_id` int(255) NOT NULL default '0',
  `materiaal_aantal` int(255) NOT NULL default '0',
  `sessie_id` char(255) NOT NULL default '',
  PRIMARY KEY  (`bestel_id`)
) TYPE=MyISAM;

CREATE TABLE `tmp_sessie` (
  `id` int(11) NOT NULL auto_increment,
  `sessie_id` char(255) NOT NULL default '',
  `timestamp` int(255) NOT NULL default '0',
  `ipnummer` char(15) NOT NULL default '',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM;

dit is een onderdeel van een soort webshop. wat er nu gebeurt is dat wanneer een sessie verlopen is (op het moment dat de huidige timestamp > dan tmp_sessie.timestamp)
PHP:
1
2
3
4
5
6
include("database.php");
$curr_time = time();

//verwijderen van oude sessie id's
$query2 = "DELETE FROM tmp_sessie WHERE timestamp < '$curr_time';";
mysql_query($query2, $connection);

Als een bezoeker nu een bestelling in zijn bestellijst had staan en zijn sessie verloopt dan blijft zijn bestelling wel in de tabel tmp_bestellijst staan.

als hij dan een dag later opnieuw komt is zijn sessie verlopen en zal hij een nieuw sessie id krijgen waarna hij opnieuw een bestellijst kan maken. zijn oude sessie id is dan wel verwijderd maar zijn bestellijst staat nog in de database

wat ik dus nu wil is alle records verwijderen uit de tabel tmp_bestellijst als het veld tmp_bestellijst.sessie_id niet voor komt in de tabel tmp_sessie.sessie_id

ik ben al een tijdje aan het kloten geweest met queries maar ik kom er niet uit

kan iemand mij helpen?

edit:
de enige oplossing die ik kan bedenken is simpelweg voordat ik de verlopen sessies verwijder uit de database deze in een array zetten en allemaal stuk voor stuk verwijderen uit tmp_bestellijst maar dit is niet erg netjes en efficient...

[ Voor 11% gewijzigd door Verwijderd op 30-03-2004 17:02 ]


  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Kun je niet gewoon alle records uit tmp_bestellijst verwijderen die niet meer in tmp_sessie voorkomen?

Never underestimate the power of


  • ATS
  • Registratie: September 2001
  • Laatst online: 12-02 13:46

ATS

Hint:
Je kan de resultaten van een join testen op Is Null.

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


  • mindcrash
  • Registratie: April 2002
  • Laatst online: 22-11-2019

mindcrash

Rebellious Monkey

Waarom gebruik je uberhaupt een database om al die gegevens op te slaan? Is het niet veel eenvoudiger/sneller/handiger etc. om een sessie variabele te vullen met een array() van gekozen product id's en bij het opvragen van de bestellijst/winkelwagen/het winkelmandje of hoe je het ook noemen wil met behulp van die id's de gegevens van de gekozen producten uit de database te trekken?

Of is er een specifieke reden dat je alle gegevens in een tijdelijke database wil opslaan? :)

(en de session time van die session variabele wel op $aardig_lang zetten uiteraard..., je wil niet dat een bezoeker na 1 dag alle produkten die hij de vorige dag heeft gekozen en nu wil kopen opnieuw moet gaan uitzoeken :) )

[ Voor 21% gewijzigd door mindcrash op 30-03-2004 17:27 ]

"The people who are crazy enough to think they could change the world, are the ones who do." -- Steve Jobs (1955-2011) , Aaron Swartz (1986-2013)


Verwijderd

Topicstarter
cameodski schreef op 30 maart 2004 @ 17:17:
Kun je niet gewoon alle records uit tmp_bestellijst verwijderen die niet meer in tmp_sessie voorkomen?
dat wil ik dus ook doen

wat ik wil doen in pseudo:
delete record from tmp_bestellijst where tmp_sessie.sessie_id niet voor komt in tmp_bestellijst.sessie_id

het lukt mij niet om hiervan een sql query te maken ik heb wel redelijk veel ervaring in sql maar niet in dit soort complexe queries

[ Voor 15% gewijzigd door Verwijderd op 30-03-2004 18:39 ]


Verwijderd

Topicstarter
ik heb nu het volgende:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
include("database.php");
$curr_time = time();

//bepalen van sessie_id's die verwijderd moeten worden
$query22 = "SELECT sessie_id FROM tmp_sessie WHERE timestamp < '$curr_time';";
$result = mysql_query($query22, $connection);

//stuk voor stuk verwijderen uit tabel tmp_bestellijst
while ($row = mysql_fetch_array($result)) {
    $id = $row[sessie_id];
    $query23 = "DELETE FROM tmp_bestellijst WHERE sessie_id = '$id';";
    mysql_query($query23, $connection);
}

//verwijderen uit tabel tmp_sessie
$query24 = "DELETE FROM tmp_sessie WHERE timestamp < '$curr_time';";
mysql_query($query24, $connection);

dit is niet erg efficient helaas maar ik weet geen betere oplossing..

[ Voor 26% gewijzigd door Verwijderd op 30-03-2004 23:24 ]


  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Ik MSSQL zou de syntax als volgt zijn (zonder gebruik te maken van een subquery).
code:
1
2
3
4
DELETE tmp_bestellijst 
FROM tmp_bestellijst b
LEFT OUTER JOIN tmp_sessie s ON (s.sessie_id = b.sessie_id)
WHERE s.sessie_id IS NULL

Je gooit nu dus alle bestellijsten weg waarvoor geen sessie meer bestaat. Of die helemaal in MySQL werkt, weet ik niet, maar dat moet je zelf maar even proberen.

Voor het leggen van relaties een char(255) gebruiken, is trouwens niet bepaald goed voor de performance, dus als dat je daar gewoon een int(4) voor kunt gebruiken, zou ik je dat zeker aanraden.

Never underestimate the power of


Verwijderd

Topicstarter
cameodski schreef op 30 maart 2004 @ 23:37:
Ik MSSQL zou de syntax als volgt zijn (zonder gebruik te maken van een subquery).
code:
1
2
3
4
DELETE tmp_bestellijst 
FROM tmp_bestellijst b
LEFT OUTER JOIN tmp_sessie s ON (s.sessie_id = b.sessie_id)
WHERE s.sessie_id IS NULL

Je gooit nu dus alle bestellijsten weg waarvoor geen sessie meer bestaat. Of die helemaal in MySQL werkt, weet ik niet, maar dat moet je zelf maar even proberen.
ik heb in de afgelope twee uur vanalles geprobeerd maar ik kom er niet uit...

wat ik nu het is het volgende
PHP:
1
2
3
4
5
6
7
//verwijderen uit tabel tmp_sessie
$query24 = "DELETE FROM tmp_sessie WHERE timestamp < '$curr_time';";
mysql_query($query24, $connection);


$query25 = "DELETE FROM tmp_bestellijst LEFT OUTER JOIN tmp_sessie ON tmp_sessie.sessie_id = tmp_bestellijst.sessie_id WHERE tmp_bestellijst.sessie_id IS NULL";
mysql_query($query25, $connection) or die("vind ie nie leuk!");

dit is de manier zoals ik die van de website van mysql kan halen

het gaat er dus om dat ik de query die cameodski gaf omgezet moet worden naar een mysql statement

ziet iemand wat ik over het hoofd zie?

  • MatHack
  • Registratie: Oktober 2001
  • Niet online

MatHack

Dev by day, Gamer by night

Worden de records gewoon niet verwijderd of geeft het script een foutmelding?

There's no place like 127.0.0.1


Verwijderd

Topicstarter
MatHack schreef op 31 maart 2004 @ 08:36:
Worden de records gewoon niet verwijderd of geeft het script een foutmelding?
het script geeft een melding (mijn eigen ingebouwde melding) "vind ie nie leuk!"

de query is dus niet in orde...

  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 13-01 07:19
Als je nou eens de echte foutmelding weergeeft ipv je eigen? Zal toch handiger zijn... mysql_error()

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

Verwijderd schreef op 30 maart 2004 @ 18:32:
wat ik wil doen in pseudo:
delete record from tmp_bestellijst where tmp_sessie.sessie_id niet voor komt in tmp_bestellijst.sessie_id
Je hebt 'm al zowat staan joh!

code:
1
2
DELETE FROM tmp_bestellijst WHERE sessie_id NOT IN
   (SELECT sessie_id FROM tmp_sessie)


(let op: een 'not in' schijnt niet zo vreselijk snel te zijn)

Siditamentis astuentis pactum.


  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Varienaja schreef op 31 maart 2004 @ 09:23:
[...]

Je hebt 'm al zowat staan joh!

code:
1
2
DELETE FROM tmp_bestellijst WHERE sessie_id NOT IN
   (SELECT sessie_id FROM tmp_sessie)


(let op: een 'not in' schijnt niet zo vreselijk snel te zijn)
Er staat mij bij dat ik wel eens gehoord heb, dat subqueries niet in alle versies van MySQL werken, dus vandaar mijn constructie met de LEFT JOIN.

En als een 'not in' wel mogelijk is dan zou dat als het goed is wel de snelste optie zijn.

[ Voor 12% gewijzigd door cameodski op 31-03-2004 09:33 ]

Never underestimate the power of


Verwijderd

Topicstarter
cameodski schreef op 31 maart 2004 @ 09:31:
[...]

Er staat mij bij dat ik wel eens gehoord heb, dat subqueries niet in alle versies van MySQL werken, dus vandaar mijn constructie met de LEFT JOIN.

En als een 'not in' wel mogelijk is dan zou dat als het goed is wel de snelste optie zijn.
MySQL versie: 3.23.56

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Fout

SQL-query :  

DELETE FROM tmp_bestellijst WHERE sessie_id NOT IN (

SELECT sessie_id
FROM tmp_sessie
) 

MySQL retourneerde: 

#1064 - You have an error in your SQL syntax near 'SELECT sessie_id
FROM tmp_sessie )' at line 1 

helaas dit werkt niet

ook de eerder gegeven optie werkt niet dit had ik al getest maar hieronder de exacte foutmelding zoals phpmyadmin die geeft.
SQL:
1
2
3
4
5
6
7
8
9
Fout

SQL-query :  

DELETE tmp_bestellijst FROM tmp_bestellijst b LEFT OUTER JOIN tmp_sessie s ON ( s.sessie_id = b.sessie_id ) WHERE s.sessie_id IS NULL 

MySQL retourneerde: 

#1064 - You have an error in your SQL syntax near 'tmp_bestellijst FROM tmp_bestellijst b LEFT  OUTER  JOIN tmp_sessie s ON ( s.ses' at line 1 


ziet iemand een foutje in de query of heeft n ander id?

[ Voor 3% gewijzigd door Verwijderd op 10-04-2004 11:17 ]


  • Marijn_S
  • Registratie: Februari 2001
  • Niet online
code:
1
DELETE tmp_bestellijst FROM tmp_bestellijst

Die eerste tmp_bestellijst hoort daar niet in ieder geval, lijkt me.

System specs - Ik word blij van knipperende lichtjes.


  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 19:24
Probeer eerst eens met een select query de gegevens die je wilt verwijderen te laten zien en ga dan pas proberen iets te deleten. Is het overigens geen idee om in de tabel gewoon een veldje del te maken met als type enum('0','1') en dan alleen de records selecteren waar del=0?
Pagina: 1