[mysql] LIMIT / OFFSET incorrect

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 20:06

Saven

Administrator

Topicstarter
Holaa,

Ik loop tegen iets aan waar ik maar niet over uit kan. Ik heb een tabel 'logs' in mijn database. Verzamelt een zooi errors en andere meuk :P Heeft op moment van schrijven precies 7825 records volgens phpMyAdmin.

Heb een kleine php wrapper met pagination geschreven om zo de logs snel te kunnen bekijken. Het probleem is echter dat het lijkt alsof er minder records zijn dan een COUNT() aangeeft :X

Query:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT
   LEFT(`log`, 150) AS log,
   logs.id,
   shop_id,
   module_id,
   product_id,
   order_id,
   time,
   type,
   shops.name as shop_name 
FROM logs
JOIN
   shops ON (logs.shop_id = shops.id)
ORDER BY id DESC
LIMIT 25 OFFSET 7800


Zou zoals verwacht de laatste 25 records terug moeten geven. Geeft echter niks terug. De 'eerste' offset die de laatste results teruggeeft is.

code:
1
LIMIT 25 OFFSET 7700

En geeft dan 5 records weer.

Lijkt dus alsof er meer dan 100 records een spook geworden zijn oid? :') Kan het niet verklaren, heb 100 keer de query bekeken en vergeleken met voorbeelden op internet (terwijl ik dit al 10 jaar doe ofzo _O- ) Is dit een bug in mysql? Semi corrupte tabel?

Acties:
  • +1 Henk 'm!

Verwijderd

Het lijkt me dat er dan een paar logs-records zijn die geen corresponderend shop record hebben.

[ Voor 4% gewijzigd door Verwijderd op 27-05-2017 20:54 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Doe eens een COUNT-query met exact dezelfde JOIN en/of WHERE, inderdaad. Anders ben je appels met peren aan het vergelijken.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 20:06

Saven

Administrator

Topicstarter
Verwijderd schreef op zaterdag 27 mei 2017 @ 20:54:
Het lijkt me dat er dan een paar logs-records zijn die geen corresponderend shop record hebben.
NMe schreef op zaterdag 27 mei 2017 @ 20:57:
Doe eens een COUNT-query met exact dezelfde JOIN en/of WHERE, inderdaad. Anders ben je appels met peren aan het vergelijken.
Hmm goede tip idd,
code:
1
SELECT COUNT(logs.id) FROM logs JOIN shops ON (logs.shop_id = shops.id)

Geeft idd 7705 records. Het kán eigenlijk niet dat er geen matches worden gemaakt met de shops tabel, uit die tabel wordt namelijk nooit wat verwijderd |:(

Acties:
  • +1 Henk 'm!

Verwijderd

SQL:
1
SELECT * FROM logs WHERE NOT shop_id IN (SELECT id FROM shops)

:)

Acties:
  • +1 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 20:06

Saven

Administrator

Topicstarter
Verwijderd schreef op zaterdag 27 mei 2017 @ 21:03:
SQL:
1
SELECT * FROM logs WHERE NOT shop_id IN (SELECT id FROM shops)

:)
Hehe thanks, ik had die query net ook in elkaar geflanst.

Er missen idd een paar shops, :F zou onmogelijk moeten zijn. Maarja aannames zijn zoals hier weer blijkt killing :P Thanks voor t meedenken jongens

Acties:
  • +1 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Saven schreef op zaterdag 27 mei 2017 @ 21:06:
[...]

Hehe thanks, ik had die query net ook in elkaar geflanst.

Er missen idd een paar shops, :F zou onmogelijk moeten zijn. Maarja aannames zijn zoals hier weer blijkt killing :P Thanks voor t meedenken jongens
Dit soort aannames zijn heel simpel te ondervangen door gewoon een foreign key op je shop_id te zetten (moet je alleen even goed nadenken wat je wilt dat er gebeurt als je toch een shop verwijdert)

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
En keek je naar de output van een COUNT(*) of naar het aantal rijen in een tabel? Dat laatste is bij InnoDB altijd een schatting.

Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 20:06

Saven

Administrator

Topicstarter
GlowMouse schreef op maandag 29 mei 2017 @ 01:32:
En keek je naar de output van een COUNT(*) of naar het aantal rijen in een tabel? Dat laatste is bij InnoDB altijd een schatting.
Beide, maar kwamen overeen :P Maar goed om te weten altijd met een count te doen d:)b

Acties:
  • 0 Henk 'm!

  • Robicide
  • Registratie: Maart 2016
  • Laatst online: 19:07
Gomez12 schreef op maandag 29 mei 2017 @ 00:17:
[...]

Dit soort aannames zijn heel simpel te ondervangen door gewoon een foreign key op je shop_id te zetten (moet je alleen even goed nadenken wat je wilt dat er gebeurt als je toch een shop verwijdert)
Of een LEFT OUTER JOIN als je alle records uit je Logs tabel wil hebben, dus ook wanneer shop_id null is.
Pagina: 1