[MySQL] Subquery vraagje

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

  • OverSoft
  • Registratie: December 2000
  • Laatst online: 09-04 14:42
Ik heb een heel irritant probleempje en ik denk dat dat echt een supersimpele oplossing heeft, maar ik kan het maar niet vinden.

Ik probeer de volgende sq te doen:
SQL:
1
DELETE FROM prices WHERE id IN (SELECT id, COUNT(artlcode) as aantal FROM prices GROUP BY artlcode HAVING aantal > 1);


Uiteraard werkt dit niet, met de terechte opmerking van MySQL als gevolg:
SQL:
1
2
Error Code : 1241
Operand should contain 1 column(s)


Enig idee hoe ik alleen de ID uit de subquery vis, terwijl de COUNT wel gewoon door blijft werken?

Verwijderd

SQL:
1
DELETE FROM prices WHERE id IN (SELECT id FROM prices GROUP BY artlcode HAVING COUNT(artlcode) > 1);

:?

  • DizzyWeb
  • Registratie: Februari 2001
  • Nu online

DizzyWeb

Ondertiteld

Eerste dat in me op komt, kan je niet "HAVING COUNT(...) > 1" doen?

Verwijderd

DizzyWeb schreef op donderdag 23 februari 2006 @ 15:09:
Eerste dat in me op komt, kan je niet "HAVING COUNT(...) > 1" doen?
Te laat :P

  • OverSoft
  • Registratie: December 2000
  • Laatst online: 09-04 14:42
Okee, that was kinda dumb... :P
De subquery werkt nu, nu krijg ik echter het volgende probleem:

code:
1
2
Error Code : 1093
You can't specify target table 'prices' for update in FROM clause

[ Voor 6% gewijzigd door OverSoft op 23-02-2006 15:12 ]


Verwijderd

Is het niet:

DELETE FROM prices WHERE id IN (SELECT id, COUNT(artlcode) as aantal FROM prices GROUP BY id HAVING aantal > 1);

Verwijderd

OverSoft schreef op donderdag 23 februari 2006 @ 15:12:
Okee, that was kinda dumb... :P
De subquery werkt nu, nu krijg ik echter het volgende probleem:

code:
1
2
Error Code : 1093
You can't specify target table 'prices' for update in FROM clause
Wat doet je query eigenlijk :? Je haalt alle ID's weg op deze manier 8)7

[ Voor 7% gewijzigd door Verwijderd op 23-02-2006 15:14 ]


  • Peter
  • Registratie: Januari 2005
  • Laatst online: 23-03 22:22
Dubbellen verwijderen?

  • Swaptor
  • Registratie: Mei 2003
  • Laatst online: 16-02 22:21

Swaptor

Java Apprentice

Het zal te maken hebben met het feit dat je nu tegelijk iets wil opvragen en deleten uit een en dezelfde tabel.

Wanneer je je subquery runt op een temp-table ( SELECT .. as temp) zou het moeten werken.

(Tenzij ik echt helemaal aan mijn suikerspiegel moet werken)

Ontdek mij!
Proud NGS member
Stats-mod & forum-dude


Verwijderd

Ah, nu zie ik het.

Moet denk ik dan idd met een temp-table :)

  • OverSoft
  • Registratie: December 2000
  • Laatst online: 09-04 14:42
Verwijderd schreef op donderdag 23 februari 2006 @ 15:13:
[...]

Wat doet je query eigenlijk :? Je haalt alle ID's weg op deze manier 8)7
Mijn tabel bestaat uit 4 columns:
id - artlcode - countfrom - price


ID is, tsja, id :P
Artlcode is een productcode
CountFrom is een aantal vanaf waar de prijs geldt.
Price is de prijs die vanaf die countfrom geldt.

Nu is er wegens een programmeer foutje meerdere rows ingeslopen die allebei dezelfde artlcode en countfrom = 1 hebben. (Op deze site zijn alle counts 1, echter op enkele andere niet, ik gebruik dit script voor meer sites).

Nu moet er van elke artlcode 1 overblijven.
Dat probeer ik hiermee te bereiken (alle dubbele rijen zijn enkel dubbel, dus niet dat zij er 3x instaan ofzo).

[ Voor 3% gewijzigd door OverSoft op 23-02-2006 15:19 ]


Verwijderd

Swaptor, nope je suikerspiegel is goed :) Op de ene plek vraag je dingen op uit de tabel, op een andere plek gooi je ze weg... Waarom doe je niet iets als

DELETE FROM prices GROUP BY artlcode COUNT(artlcode) > 1

Of zoals mijn voorganger zegt met een temp-tabel:


CREATE TEMPORARY TABLE tmptable
SELECT A.* FROM table1 AS A, table1 AS B
WHERE A.username LIKE '%2'
AND A.ID = B.ID
AND A.username <> B.username;

DELETE table1 FROM table1
INNER JOIN tmptable
ON table1.username = tmptable.username;

[ Voor 49% gewijzigd door Verwijderd op 23-02-2006 15:21 ]


Verwijderd

Met een temporary table dus...
Verwijderd schreef op donderdag 23 februari 2006 @ 15:20:
Swaptor, nope je suikerspiegel is goed :) Op de ene plek vraag je dingen op uit de tabel, op een andere plek gooi je ze weg... Waarom doe je niet iets als

DELETE FROM prices GROUP BY artlcode COUNT(artlcode) > 1
Kweenie, maar dat zou met een HAVING moeten, kweet niet of dat met een DELETE FROM ook werkt :?

[ Voor 88% gewijzigd door Verwijderd op 23-02-2006 15:21 ]


  • OverSoft
  • Registratie: December 2000
  • Laatst online: 09-04 14:42
Yep fixed it:

SQL:
1
2
3
CREATE TEMPORARY TABLE mytemptable SELECT id FROM prices GROUP BY artlcode HAVING COUNT(artlcode) > 1;
DELETE FROM prices WHERE id IN (SELECT id FROM mytemptable);
DROP TABLE mytemptable;


Thnx allemaal :)

[ Voor 19% gewijzigd door curry684 op 23-02-2006 16:38 . Reden: graag geen lichaamsdelen in je queries ]


Verwijderd

OverSoft schreef op donderdag 23 februari 2006 @ 15:26:
Yep fixed it:

SQL:
1
2
3
CREATE TEMPORARY TABLE mytemptable SELECT id FROM prices GROUP BY artlcode HAVING COUNT(artlcode) > 1;
DELETE FROM prices WHERE id IN (SELECT id FROM mytemptable);
DROP TABLE mytemptable;


Thnx allemaal :)
Nu nog een normale naam 8) :+.

[ Voor 6% gewijzigd door curry684 op 23-02-2006 16:38 ]


  • OverSoft
  • Registratie: December 2000
  • Laatst online: 09-04 14:42
Ach, is toch maar een temptable ;)
Pagina: 1