Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[mysql] is dit mogelijk met mysql?

Pagina: 1
Acties:
  • 828 views

  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Stel ik heb een database gevuld met een aantal id's die er alsvolgt uitziet:

id
2
3
4
6
8
9
13
14
15

Nu wil ik een result set met id's uit de database halen die de even of oneven rijen eruit haalt, dus telkens wordt 1 stap overgeslagen, in dit geval zou het zijn:

2
4
8
13
15

Het gaat dus niet om de even of oneven id's maar om de even of oneven rijen. Is zoiets mogelijk in een query? In PHP kan ik dit wel verwezenlijken, maar het zou mooier zijn als het met 1 query kan?

  • posttoast
  • Registratie: April 2000
  • Laatst online: 00:03
Ik ben vooral heel benieuwd waarom je dit wilt!

omniscale.nl


  • whoami
  • Registratie: December 2000
  • Laatst online: 01:11
hoe definieer je een oneven rij ?

https://fgheysels.github.io/


  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Als ik ga [google=mysql get row id] dan kom ik o.a. het volgende tegen:

http://forums.mysql.com/read.php?10,187124,187124#msg-187124

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


  • alx
  • Registratie: Maart 2002
  • Niet online

alx

posttoast schreef op maandag 01 september 2008 @ 11:11:
Ik ben vooral heel benieuwd waarom je dit wilt!
Precies. Vaak hebben mensen een probleem, bedenken zelf een deel van de oplossing en komen dan met een al dan niet goed oplosbaar subprobleempje aanzetten, terwijl de ingeslagen weg niet goed is.
Wat is je hoofdprobleem en in welke context?

Verwijderd

BtM909 schreef op maandag 01 september 2008 @ 11:12:
Als ik ga [google=mysql get row id] dan kom ik o.a. het volgende tegen:

http://forums.mysql.com/read.php?10,187124,187124#msg-187124
Da's toch iets anders dan om de rij selecteren?

Ik kwam dit tegen:
code:
1
2
3
4
5
6
7
8
9
10
SELECT * 
FROM 
 (
  SELECT @a:=@a+1 as 'a'
      ,ordr_ID
      ,poft_Sub_Month 
  FROM er_poft
  JOIN (SELECT @a:=0) x
 ) y
WHERE mod(a,2) = 0;

op http://www.dbforums.com/showthread.php?t=1628292 het is hacky maar het zal vast werken ;)

[ Voor 32% gewijzigd door Verwijderd op 01-09-2008 11:19 ]


  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Ik wil dit om uit de database een snapshot te maken door telkens een rij over te slaan, zo kan ik een database van 400 rijen verkorten tot 200 rijen.

Het maakt dus niet uit of hij de even of oneven rijen neemt.

Aangezien de row() index bij 1 begint is mijn voorbeeld het oneven voorbeeld.

  • Tiemez
  • Registratie: December 2003
  • Laatst online: 24-10-2022
oneven:

code:
1
2
3
SELECT id
FROM tabel
WHERE MOD( id, 2) =1;


even
code:
1
2
3
SELECT id
FROM test
WHERE MOD( id, 2 ) =1;

  • Koppensneller
  • Registratie: April 2002
  • Laatst online: 22:55

Koppensneller

winterrrrrr

SQL:
1
2
....
WHERE MOD(id, 2) = 1


Zoiets?

edit:
Shit, te laat ;)

[ Voor 20% gewijzigd door Koppensneller op 01-09-2008 11:21 ]


Verwijderd

RSD schreef op maandag 01 september 2008 @ 11:18:
Ik wil dit om uit de database een snapshot te maken door telkens een rij over te slaan, zo kan ik een database van 400 rijen verkorten tot 200 rijen.

Het maakt dus niet uit of hij de even of oneven rijen neemt.

Aangezien de row() index bij 1 begint is mijn voorbeeld het oneven voorbeeld.
Je wil een snapshot met maar de helft van de data? Of wil je iets waarmee je kan kijken of de database is veranderd? In het laatste geval moet je eens richting checksums gaan kijekn gok ik zo.

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Verwijderd schreef op maandag 01 september 2008 @ 11:17:
[...]

Da's toch iets anders dan om de rij selecteren?

Ik kwam dit tegen:
code:
1

op http://www.dbforums.com/showthread.php?t=1628292 het is hacky maar het zal vast werken ;)
GoT is geen afhaalchinees, dus iemand in een richting duwen zodat hij zelf het probleem kan oplossen is veel effectiever ;)

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 17-11 15:37

Janoz

Moderator Devschuur®

!litemod

simonkey:

Da's toch iets anders dan om de rij selecteren?
Ja en nee. Het punt is dat het selecteren van de oneven rijen op te splitsen is in twee subproblemen:

1. Uberhaupt de telling van de rijen te bepalen.
2. Daaruit enkel de oneven rijen nemen.

De post van BtM909 gaat over puntje 1.


-edit-
En je afhaalchinees oplossing bevat precies het stukje dat ook in de door BtM's gepost thread naar voren kwam...

[ Voor 29% gewijzigd door Janoz op 01-09-2008 11:25 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • remmelt
  • Registratie: Januari 2001
  • Laatst online: 09-04 12:25
RSD schreef op maandag 01 september 2008 @ 11:18:
Ik wil dit om uit de database een snapshot te maken door telkens een rij over te slaan, zo kan ik een database van 400 rijen verkorten tot 200 rijen.
.... wat?

  • robbert
  • Registratie: April 2002
  • Laatst online: 20:18
KoppenSneller schreef op maandag 01 september 2008 @ 11:20:
SQL:
1
2
....
WHERE MOD(id, 2) = 1


Zoiets?

edit:
Shit, te laat ;)
En wat als je toevallig heel veel even id nummers hebt (veel records met een oneven id nummer zijn verwijderd...)?
RSD schreef op maandag 01 september 2008 @ 11:18:
Ik wil dit om uit de database een snapshot te maken door telkens een rij over te slaan, zo kan ik een database van 400 rijen verkorten tot 200 rijen.
Is het dan niet veel slimmer om random 200 rijen uit te kiezen?

[ Voor 33% gewijzigd door robbert op 01-09-2008 11:25 ]


  • Koppensneller
  • Registratie: April 2002
  • Laatst online: 22:55

Koppensneller

winterrrrrr

robbert schreef op maandag 01 september 2008 @ 11:24:
[...]

En wat als je toevallig heel veel even id nummers hebt (veel records met een oneven id nummer zijn verwijderd...)?

[...]

Is het dan niet veel slimmer om random 200 rijen uit te kiezen?
SQL:
1
2
3
SELECT id, (count(*) FROM table t WHERE t.id < id) as newid
FROM table
WHERE MOD(newid, 2) = 1


Zoiets?

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
robbert schreef op maandag 01 september 2008 @ 11:24:
Is het dan niet veel slimmer om random 200 rijen uit te kiezen?
Nee, het is slimmer om gewoon alle rijen te pakken. :+ Alle rijen gebruiken is net zo efficient als de helft pakken. Anders verwoord: als je de helft van je rijen selecteert, is een full table scan doorgaans toch al het beste executie plan.

De wens om helft van de rijen te exporteren is echt ontzettend absurd. Test dan of met een goede, maar flink kleinere testset, of gebruik de gehele dataset. Maar de helft pakken is een micro-optimalisatie die in 9 vd 10 gevallen niet eens het typen van je startpost waard is.
KoppenSneller schreef op maandag 01 september 2008 @ 11:33:
[...]
SQL:
1
2
3
SELECT id, (count(*) FROM table t WHERE t.id < id) as newid
FROM table
WHERE MOD(newid, 2) = 1

Zoiets?
Tenzij er echt een gruwelijk grote dataset over een traag netwerk gepompt moet worden, zal het exporteren van de hele tabel wellicht sneller zijn. Let's face it, het is een baggerquery met discutabel nut.

{signature}


  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Die afhaalchinees oplossing lijkt niet te werken, ik krijg bij elke rij row=0 terug...

Nu stond in die oplossing iets als:

SELECT id,@a:=IF(@a IS NULL,0,@a +1 ) AS a
FROM table

Maar dit geeft de id's weer en bij elke id staat a als 0.

SELECT @a :=0;# Rows: 1
SELECT id, @a := @a +1 AS a
FROM table

lijkt wel te werken, nu de mod er nog in zien te krijgen ;-)

[ Voor 21% gewijzigd door RSD op 01-09-2008 11:48 ]


  • Koppensneller
  • Registratie: April 2002
  • Laatst online: 22:55

Koppensneller

winterrrrrr

Voutloos schreef op maandag 01 september 2008 @ 11:46:
Tenzij er echt een gruwelijk grote dataset over een traag netwerk gepompt moet worden, zal het exporteren van de hele tabel wellicht sneller zijn. Let's face it, het is een baggerquery met discutabel nut.
Absoluut :) Ik zie ook niet in waarom de TS de helft van zijn dataset wou willen selecteren. Ik zag alleen wel een kleine uitdaging in die query, zo op de maandagochtend ;)[quote]

[ Voor 48% gewijzigd door Koppensneller op 01-09-2008 11:49 ]


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Pfff, dan neem je zelf even de moeite om je maaltijd even in de magnetron te stoppen en dan ben je alsnog klaar. :z

{signature}


Verwijderd

RSD je hebt wel door dat je iets onnodigs zwaars aan het maken bent toch? Dat het kan volgens die manier betekent niet dat je het ook moet doen.

  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Overigens het gaat in mijn geval niet om de hele database, maar om de laatste 200 records. Hier wil ik een snapshot van weergeven in 100 items met 20 stuks per pagina. Daarnaast is de database zodanig dat voor id=2 geldt dat id=1 en id=3 teveel lijken op id=2 , vandaar de wens om deze te skippen voor maximale variatie.

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Dan denk je na of je niet op die mate van gelijkheid kan filteren, of je negeert gewoon het hele 'probleem'. KISS.

{signature}


  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Voor:

SELECT id, @a := @a +1 AS aw
FROM movies
WHERE MOD( aw , 2 ) =1

zegt mysql nu dat hij de kolom aw niet kent? Dit heb ik wel vaker met die aliassen...

  • remmelt
  • Registratie: Januari 2001
  • Laatst online: 09-04 12:25
Waaruit maar weer blijkt dat als je nou een probleembeschrijving geeft, er mensen een inzichtelijk antwoord kunnen geven, terwijl als je een technisch (te) ver doordachte weg ingeslagen bent en daar over vraagt, je de wind van voren kan verwachten...

Als omringende data te veel lijkt op de huidige row, ben je dan wel goed bezig met je datamodel?

Als 1 en 3 teveel op 2 lijken, dan volgt daar uit dat 3 en 5 op 4 lijken, en dat 2 en 4 op 3 lijken, en dat je dus zo wel voorzichtig kan concluderen dat 2 ook op 4 zal lijken.

Verder denk ik dat het woord snapshot niet in de juiste context wordt gebruikt?

Misschien is het beter uit te leggen wat je conceptueel wil doen in plaats van te vissen naar technische antwoorden.

  • Tukk
  • Registratie: Januari 2002
  • Laatst online: 17-11 10:45

Tukk

De α-man met het ẞ-brein

remmelt schreef op maandag 01 september 2008 @ 12:04:
..
Als omringende data te veel lijkt op de huidige row, ben je dan wel goed bezig met je datamodel?
..
Misschien is het beter uit te leggen wat je conceptueel wil doen in plaats van te vissen naar technische antwoorden.
:Y
IMHO beide essentielere vragen dan het bouwen van de query.

Q: How many geeks does it take to ruin a joke? A: You mean nerd, not geek. And not joke, but riddle. Proceed.


  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Het gaat om een database met films. Het is niet helemaal juist wat ik zei over de id's. Ik had moeten zeggen dat de voor id=2, de id=1 lijkt op id=2 etc etc... dus de voorgaande id's lijken op elkaar. Het zijn films die opgesplitst zijn in veelal twee stuks en ik wil dus geen dubbele sets hebben. Maar de database is een mengelmoes van alles door elkaar. Daarnaast hoeft het allemaal niet zo nauw te zijn. Ik wil gewoon dat hij de oneven rijen eruit haalt dan is het voor mij al voldoende. Ik zou natuurlijk bij elke film een extra veld kunnen maken welk deel het is ed, maar dat is niet nodig, omdat de films ook weer als apart zijn te aanschouwen. Het is misschien een wazig verhaal, maar dat van die id's filteren op rij en dan even of onven is voor mij voldoende.

Voor diegene die ook ooit zoiets willen maken hier de oplossing:

SELECT @a:=0;
SELECT id,@a:=@a+1 AS a
FROM table HAVING MOD(a,2)=1

[ Voor 8% gewijzigd door RSD op 01-09-2008 12:18 ]


Verwijderd

Ik zou een extra tabel toevoegen met de video-episodes gekoppeld naar een videoID. Of een distinct op de film-naam (zodat gelijke benamingen (en dus delen?) niet getoond worden). De eerste oplossing lijkt mij de beste, normalizatie. Succes.

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Waarom zo moeilijk doen als het maar om 200 records gaat. Select ze gewoon allemaal, en loop er dan in host code overheen met for(i=0; i<200; i+=2) {}. Simpel. (bovendien is het nog maar de vraag of dat trager is dan al die exotische queries)

[ Voor 20% gewijzigd door Zoijar op 01-09-2008 12:17 ]


  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Ik heb een functie en die moet ik een query voeren en dan maakt hij dus de output die functie gebruik ik overal... dus vandaar ook de wens om het in een query te doen, maar mijn bovenstaande oplossing lijkt ook niet te werken... de id's blijven hetzelfde en de rows worden wel even ... echt heel raar..

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

RSD schreef op maandag 01 september 2008 @ 12:22:
Ik heb een functie en die moet ik een query voeren en dan maakt hij dus de output die functie gebruik ik overal... dus vandaar ook de wens om het in een query te doen, maar mijn bovenstaande oplossing lijkt ook niet te werken... de id's blijven hetzelfde en de rows worden wel even ... echt heel raar..
Wellicht wordt het dan eens tijd om je framework wat flexibeler te maken? Dit zal vast niet de laatste keer zijn dat je iets met doen met de uitkomst van een query voordat je het naar je output gooit ;)

[ Voor 14% gewijzigd door een moderator op 01-09-2008 12:33 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
De kneep zit 'm in de mod functie. Stoei daar maar even wat mee en dan kom je er best uit als je een beetje je best doet. Ik begin onderhand een beetje aardig beu te worden steeds je handje vast te houden.

Voor het geval je het niet door had: we zijn geen persoonlijke helpdesk. Verdiep je gewoon eens in de materie en zorg dat je weet waar je mee bezig bent. Je vragen zijn echt basic en met een beetje kennis van de materie waar je mee bezig bent moet je met de bovenstaande tips makkelijk tot een werkende oplossing kunnen komen.

Daarnaast kan het ook geen kwaad om een ander eens een handje te helpen... :X

[ Voor 13% gewijzigd door RobIII op 01-09-2008 12:35 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1

Dit topic is gesloten.