[MySQL] speciale SELECT-query

Pagina: 1
Acties:

  • StiGMaTa
  • Registratie: Juni 2003
  • Laatst online: 05-05 21:11
Ik had een vraagje ivm met het volgende probleem:
Ik ben een functie aan het schrijven voor mijn shoutbox om de laatste post te vinden die de gebruiker gedaan heeft.
Nu zou ik dus graag uit de MySQL (4.0.22) database de gegevens ophalen die boven de post van de gebruiker zitten. De gebruiker wordt geïdentificeerd door een 'member_id' in tabel 'guestbook'.
Ik kan dit makkelijk in 2 queries doen, maar dat zou zonde zijn.
Ik heb JOINS nog niet onder de knie, en ik denk dat ik daarmee mijn probleem kan oplossen.
Nog even alles op een rijtje:

Ik zou in 1 query willen zoeken naar
  • een bepaald member_id
  • van de gevonden rij het id te weten komen
  • en alles boven dit id heb ik nodig
per pagina staan er 15 posts, dus het zou zelfs handig zijn moet ik kunnen kijken welke 15 ik juist nodig heb, maar aangezien dat wat boven mijn niveau gaat is alles boven dat bepaald id goed genoeg. Vanaf daar kan ik verder werken.

Thx

Verwijderd

Wat je wilt kan wel met subqueries, maar naar mijn weten ondersteund MySQL dat nog niet in die versie. Ik kan me vergissen.


select *
from tabel
where id >= (
select id from tabel
where userid = $userid
)

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Even snel voor het idee:
SQL:
1
2
3
SELECT g1.*
FROM guestbook g1
WHERE g1.date > ( SELECT g2.date FROM guestbook g2 WHERE g2.gebruiker = '123' ORDER BY g2.date DESC LIMIT 1 )

Ik heb zelf nog nooit met sub queries gewerkt, dus ik weet niet zeker of dit werkt zo (en of die mysql versie dat ondersteund).

Noushka's Magnificent Dream | Unity


  • StiGMaTa
  • Registratie: Juni 2003
  • Laatst online: 05-05 21:11
Bedankt om zo snel te reageren, ik ga onmiddelijk aan het werk om te zien of het werkt. Indien ik het werkend krijg, zal ik nog even ter info de oplossing geven.

  • StiGMaTa
  • Registratie: Juni 2003
  • Laatst online: 05-05 21:11
De voorbeelden die ik heb gekregen, wilden om een of andere reden niet werken :s
Daarom heb ik a.d.h.v. en via dev.mysql.com gekeken wat ik nog kon proberen.
JOINS != subqueries. JOINS werken op MySQL 4.0.22.
Ik heb volgende querie gemaakt (zonder te weten wat het juist doet :s):
MySQL:
1
2
3
4
SELECT g1 . *
FROM mega_guestbook g1
LEFT JOIN mega_guestbook g2 ON ( g2.user_id =11
AND g1.id >= g2.id )


Maar MySQL doet er 6min over om de query te verwerken en het geeft totaal niet het gewenste resultaat, want ik krijg id's dubbel enzo.

Nog iemand enige voorstellen, of iemand die weet wat deze querie juist doet?

Belangrijke gegevens tabel:
id -> Primary key
user_id -> id van de user (id van de user staat in mega_members)
date -> Datum van de post
naam tabel: mega_guestbook

thx

  • napel25
  • Registratie: Januari 2002
  • Laatst online: 30-08-2025
Misschien moet je de user_id nog koppelen in de join met :
g1.user_id = g2.user_id

Je moet in ieder geval iets koppelen met een 'is gelijk teken' (=). Anders krijg je veel te veel terug.

napel25


  • StiGMaTa
  • Registratie: Juni 2003
  • Laatst online: 05-05 21:11
Het probleem is juist dat ik die niet kan koppelen, want (symplistisch uitgedrukt) ik heb eigenlijk alle posts nodig vanaf de laatste record waar het user_id = 11 (in dit voorbeeld).

*ben zelf ook nog aan het zoeken hoor, het is gewoon mijn eerste keer dat ik een query aant het maken ben die ik zelf nie snap :) *

@-NMe-: zo had ik het eigenlijk nog niet bekeken. ik ga er even over nadenken en wat uit proberen.
@All: al enorm bedankt voor de hulp!

[ Voor 19% gewijzigd door StiGMaTa op 08-06-2005 13:58 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

flattyke schreef op woensdag 08 juni 2005 @ 13:49:
Het probleem is juist dat ik die niet kan koppelen, want (symplistisch uitgedrukt) ik heb eigenlijk alle posts nodig vanaf de laatste record waar het user_id = 11 (in dit voorbeeld).
Dan moet je nog steeds wel de bij elkaar horende velden in die twee tabellen aan elkaar passen, anders link je alle velden met alle andere velden. :P

'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.


  • napel25
  • Registratie: Januari 2002
  • Laatst online: 30-08-2025
Je kan het ook nog proberen door een regel toe te voegen:

WHERE g2.id = (SELECT id FROM guestbook WHERE gebruiker = '123' ORDER BY id DESC LIMIT 1)

Dit om zeker te weten dat je alleen te laatste hebt van de betreffende user. Hiermee zou je het Cartesian produkt omzeep moeten kunnen helpen... :o)

(Edit: dit maakt de join wel overbodig zie ik nu...)

[ Voor 11% gewijzigd door napel25 op 08-06-2005 14:26 ]

napel25


  • StiGMaTa
  • Registratie: Juni 2003
  • Laatst online: 05-05 21:11
gelijk wat ik probeer, volgende queries kan ik niet uitvoeren:
MySQL:
1
2
SELECT g1.* FROM mega_guestbook g1
WHERE g1.date > ( SELECT g2.date FROM mega_guestbook g2 WHERE g2.userid = '11' ORDER BY g2.date DESC LIMIT 1 )

^^ das gewoon de code van de 2de reply aangepast aan mijn database.

Ik krijg altijd volgende foumelding, enkel met joins krijg ik die niet:
#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT g2.date FROM mega_guestbook g2 WHERE g2.userid = '11' OR

  • napel25
  • Registratie: Januari 2002
  • Laatst online: 30-08-2025
Subqueries worden nog niet ondersteund in deze versie. Dat verklaar een hoop.

Je zou in de eerste query die dubbele terug geeft kunnen een DISTINCT kunnen gebruiken. Misschien geeft die wel een goed resultaat. Maar snel zal het niet gaan.

Volgens mij is het het beste om het in meerdere stappen te doen.

napel25


Verwijderd

Is het niet zo dat dit niet anders kan dan met een sub-select, oftewel nog niet mogelijk in deze mysql versie?

In dat geval zou je 2 sql-queries kunnen draaien, met results van de eerste als values in de tweede.
Pagina: 1