[mysql] 1/3 van rows teruggeven

Pagina: 1
Acties:

  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 17-08 15:34
Ik ben nu al een aantal keren tegen het probleem aangelopen dat je in een query geen tellertje kan laten meelopen (naar mijn weten).

Nu wil ik een query die slechts de eerste van elke 3 resultaten teruggeeft.

Dus stel:

rows 1 tot en met 9, dan wil ik alleen 1,3,6,9 terug.

Nu zijn deze rows niet per definitie met een oplopende ID, dus het kan ook zijn dat id = 2 ontbreekt uit het lijstje. Dan wil ik terug: 1,4,7

Ik had dus:
code:
1
2
3
4
5
6
select 
           bla
from
          table
where
          id/3 = round(id/3)


Maar deze wil dus wel een oplopend id.


Iemand een idee?

Ik blijf er iig vrij nuchter onder....


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Ik zuig even twee oplossingen uit mijn duim, misschien heb je er wat aan:
- In een temporary table met autoincrement inserten en dan je select die je hier boven hebt daar weer op uitvoeren.
- Gewoon niet die beperking en met de mysql_data_seek-functie (ja, dit is de php-versie, maar die zal wel in meerdere libs zitten) steeds twee records overslaan.

  • TheRookie
  • Registratie: December 2001
  • Niet online

TheRookie

Nu met R1200RT

als alternatief voor de mysql_data_seek een 'gewone' query doen en dan in de while lus waarmee je de resultaten print een tellertje mee laten lopen is ook geen optie ?

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Voor mysql_data_seek moet je dat ook, maar het scheelt je steeds twee loze calls om data binnen te halen :)

  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 17-08 15:34
die while loop is eigenlijk geen optie, ik werk met mijn eigen template systeem en dit is 1 van die weinig momenten dat ik niet makkelijk een oplossing heb.

Wat ik wil is namelijk een tabel opbouwen met

X X X
X X X
X X X
X X X

een X aantal rijen met daarin 3 waarden. Dit kan ik realiseren met 2 'blocks'.
Nu moet ik echter weten hoeveel rijen er zijn en zo'n rij genereren in een 'block'.
Echt het aantal rijen is niet voldoende dus.

Als het echt niet kan met een query dan maak ik wel een hack.

P.S. die temp tabel lijkt me niet zo'n goed idee, dat is te zwaar.

[ Voor 10% gewijzigd door maartenvdv737 op 08-06-2003 12:14 ]

Ik blijf er iig vrij nuchter onder....


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

maartenvdv schreef op 08 June 2003 @ 12:13:
P.S. die temp tabel lijkt me niet zo'n goed idee, dat is te zwaar.
Te zwaar? Heb je het wel eens getest? :)

Magoed, in een fatsoenlijke database zou je het nog met een subselect kunnen doen, in Oracle werd het dan zoiets:
select * from (select ..., rownum from ...) as data where data.rownum ...

Mysql is daar niet zo'n ster in, maar vaak wordt zo'n subselect stiekem ook op de achtergrond met een temporary table uitgevoerd...


Btw, die X1 X2 X3 ...
kan je toch _veel_ makkelijker weergeven :?

Simpelweg door na elke drie records een "new line" te geven, ipv moeilijk te doen met losse blocks enzo?
Ik snap nu iig niet meer waarom jouw query steeds de 3e moet teruggeven?

[ Voor 20% gewijzigd door ACM op 08-06-2003 12:22 ]


  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 17-08 15:34
Het wordt een foto overzicht opgebouwd uit tabellen.

Wat ik dus doe:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
                      <!-- START BLOCK : spellenVert -->
                       <table>
                        <tr> 
                          <!-- START BLOCK : spellenHor -->
                          <td>
                              <strong>{naam}</strong>
                            <table>
                              <tr> 
                                <td>{screenshot}</td>
                              </tr>
                            </table>
                            {aantal} keer gespeeld
                          </td>
              <!-- END BLOCK : spellenHor -->
                        </tr>
                      </table> 
                      <!-- END BLOCK : spellenVert -->


Zo'n block genereer ik direct via een query. Geen interventie dus verder met php.
Mijn query levert een array, die array gaat naar de template parser en die maakt de blocks.

Nu kan ik wel handmatig zo'n array in elkaar knutselen, maar dat wil ik liever niet.

Ik blijf er iig vrij nuchter onder....


  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025

kvdveer

Z.O.Z.

Een ongelofelijk ranzige oplossing die ik ooit heb gebruikt voor een dergelijk probleem (ik had een rec-id nodig zonder gaten) was de volgende:

code:
1
2
3
4
5
SELECT a.[velden], count(b.id)
FROM [tabel] as a
JOIN b ON (b.id < a.id)
GROUP BY a.id
ORDER BY [veld]


Ik tel dus het aantal id's dat kleiner is dan het huidige ID. Zo weet ik 'hoeveelste' het betreffende record is, en toch sorteren op een ander veld.

Voor jou zou het iets worden als:

code:
1
2
3
4
5
SELECT a.[velden], count(b.id) as c
FROM [tabel] as a
JOIN b ON (b.id < a.id)
GROUP BY a.id
WHERE c mod 3 = 0

Localhost, sweet localhost


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Lijkt me dan dat het een 'having c mod 3 = 0' moet zijn? Een where na de group by is niet zo gebruikelijk in sql :)

Waarschijnlijk wordt het zelfs:
having count( * ) mod 3 = 0

[ Voor 22% gewijzigd door ACM op 08-06-2003 19:28 ]


  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025

kvdveer

Z.O.Z.

ACM schreef op 08 June 2003 @ 19:28:
Lijkt me dan dat het een 'having c mod 3 = 0' moet zijn? Een where na de group by is niet zo gebruikelijk in sql :)

Waarschijnlijk wordt het zelfs:
having count( * ) mod 3 = 0
count( b.* ) dan...
Je hebt gelijk MySql heeft niet bepaald goede dingen gedaan met mijn SQL-skills... MySql pikt mijn query dan ook...

Localhost, sweet localhost

Pagina: 1