🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: be.comp.programming
12 messages
12 total messages Started by Steven Thu, 27 Oct 2005 14:25
Sql vraagje
#1128
Author: Steven
Date: Thu, 27 Oct 2005 14:25
20 lines
1584 bytes
Hallo,

ik heb een vraagje ivm queries.
Stel, je hebt een tabel met een aantal records. De tabel heeft een veld 
id. Ik wil nu van die tabel 3 records: het record met id = X, het record 
dat, geordend volgens id, juist voor X komt, en het record er juist na.

Je kan dit uiteraard oplossen met meerdere queries, maar ik vroeg me 
toch af of het niet kon met slechts 1 query.

Merk op dat de id's uniek zijn, maar niet noodzakelijk opeenvolgend.

Je kan in de tabel bijvoorbeeld hebben: 1, 2, 17, 18, 19, 25, 26
als X = 19, dan zou je 18, 19 en 25 moeten krijgen als oplossing.

Iemand een oplossing ?

Groetjes,

Steven
Re: Sql vraagje
#1129
Author: Ludo
Date: Thu, 27 Oct 2005 14:30
23 lines
1884 bytes
Steven schreef:
> Hallo,
> 
> ik heb een vraagje ivm queries.
> Stel, je hebt een tabel met een aantal records. De tabel heeft een veld 
> id. Ik wil nu van die tabel 3 records: het record met id = X, het record 
> dat, geordend volgens id, juist voor X komt, en het record er juist na.
> 
> Je kan dit uiteraard oplossen met meerdere queries, maar ik vroeg me 
> toch af of het niet kon met slechts 1 query.
> 
> Merk op dat de id's uniek zijn, maar niet noodzakelijk opeenvolgend.
> 
> Je kan in de tabel bijvoorbeeld hebben: 1, 2, 17, 18, 19, 25, 26
> als X = 19, dan zou je 18, 19 en 25 moeten krijgen als oplossing.
> 
> Iemand een oplossing ?
> 
> Groetjes,
> 
> Steven

Select * From Jouw_Tabel Where X < 19      ....
Re: Sql vraagje
#1130
Author: Steven
Date: Thu, 27 Oct 2005 15:14
36 lines
1990 bytes
Ludo wrote:
> Steven schreef:
> 
>> Hallo,
>>
>> ik heb een vraagje ivm queries.
>> Stel, je hebt een tabel met een aantal records. De tabel heeft een 
>> veld id. Ik wil nu van die tabel 3 records: het record met id = X, het 
>> record dat, geordend volgens id, juist voor X komt, en het record er 
>> juist na.
>>
>> Je kan dit uiteraard oplossen met meerdere queries, maar ik vroeg me 
>> toch af of het niet kon met slechts 1 query.
>>
>> Merk op dat de id's uniek zijn, maar niet noodzakelijk opeenvolgend.
>>
>> Je kan in de tabel bijvoorbeeld hebben: 1, 2, 17, 18, 19, 25, 26
>> als X = 19, dan zou je 18, 19 en 25 moeten krijgen als oplossing.
>>
>> Iemand een oplossing ?
>>
>> Groetjes,
>>
>> Steven
> 
> 
> Select * From Jouw_Tabel Where X < 19      ....

Beste,

Ik denk niet dat je het probleem begrijpt. En mocht je het toch begrepen 
hebben, dan begrijp alleszins jouw oplossing niet. Toch bedankt.

Groetjes,

Steven
Re: Sql vraagje
#1131
Author: Ludo
Date: Thu, 27 Oct 2005 15:31
26 lines
1765 bytes
> Beste,
> 
> Ik denk niet dat je het probleem begrijpt. En mocht je het toch begrepen 
> hebben, dan begrijp alleszins jouw oplossing niet. Toch bedankt.
> 
> Groetjes,
> 
> Steven

Var A,B,X := Integer;
     Query1: TQuery;

begin
  Query1 := TQuery.Create(Self);
  Query1.SqlConnection := SqlConnection1;
  X := 19;
  A := X - 1;
  B = X + 1;
  With Query1 do
  begin
     Sql.Clear;
     Sql.Add('Select * From Jouw_Tabel Where Id Between A and B' Order 
By Id');
     Open;
   end;
Re: Sql vraagje
#1132
Author: Steven
Date: Thu, 27 Oct 2005 20:03
28 lines
1902 bytes
Ludo wrote:

> Var A,B,X := Integer;
>     Query1: TQuery;
> 
> begin
>  Query1 := TQuery.Create(Self);
>  Query1.SqlConnection := SqlConnection1;
>  X := 19;
>  A := X - 1;
>  B = X + 1;
>  With Query1 do
>  begin
>     Sql.Clear;
>     Sql.Add('Select * From Jouw_Tabel Where Id Between A and B' Order By 
> Id');
>     Open;
>   end;
> 
> 
Ik denk niet dat dat correct is. Je bent immers niet zeker of het id met 
X - 1 bestaat. het id dat net voor 19 komt, is kleiner dan 19, maar je 
weet de exacte waarde niet. De id's zijn niet noodzakelijk opeenvolgend. 
Toch bedankt. Nog suggesties?

Groetjes,

Steven
Re: Sql vraagje
#1133
Author: John Bokma
Date: Thu, 27 Oct 2005 21:58
17 lines
1713 bytes
Steven <user@example.net> wrote:
 
> Ik denk niet dat dat correct is. Je bent immers niet zeker of het id
> met X - 1 bestaat. het id dat net voor 19 komt, is kleiner dan 19,
> maar je weet de exacte waarde niet. De id's zijn niet noodzakelijk
> opeenvolgend. Toch bedankt. Nog suggesties?

Waarom zit je tabel zo inelkaar (just curious)?

Je kan met een ordening op ID en een limit wel id, plus de volgende vinden 
(limit op 2 zetten), maar geen idee hoe je in 1x alle drie op kan halen.

-- 
John Bokma
                 Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Ervaren Perl / Java programmeur beschikbaar:  http://castleamber.com/
Tevreden opdrachtgevers:     http://castleamber.com/testimonials.html
Re: Sql vraagje
#1134
Author: Ludo
Date: Thu, 27 Oct 2005 22:18
24 lines
1904 bytes
Het lukt wel, maar dan wel in 2 slagen : ( volgens mij dan toch ) :

Var A,B,X := Integer;
     Query1: TQuery;

begin
  Query1 := TQuery.Create(Self);
  Query1.SqlConnection := SqlConnection1;
  X := 19;
  With Query1 do
  begin
     Sql.Clear;
     Sql.Add('Select * From Jouw_Tabel Order By Id');
     Open;
     FindKey([X]);
     MoveBy(-1);
     A := FieldByName('Id').AsInteger;
     MoveBy(2);
     B := FieldByName('Id').AsInteger;
     Close;
     Sql.Clear;
  Sql.Add('Select * From Jouw_Tabel Where Id Between A and B' Order By ..
     Open;
   end;
Re: Sql vraagje
#1135
Author: Ludo
Date: Thu, 27 Oct 2005 22:41
34 lines
2155 bytes
Met een verbetering erbij :


Het lukt wel, maar dan wel in 2 slagen : ( volgens mij dan toch ) :

Var A,B,X := Integer;
     Query1: TQuery;
begin
  Query1 := TQuery.Create(Self);
  Query1.SqlConnection := SqlConnection1;
  X := 19;
  With Query1 do
  begin
     Sql.Clear;
     Sql.Add('Select * From Jouw_Tabel Order By Id');
     Open;
     if FindKey([X]) then
     begin
         MoveBy(-1);
         A := FieldByName('Id').AsInteger;
         MoveBy(2);
         B := FieldByName('Id').AsInteger;
         Close;
         Sql.Clear;
  Sql.Add('Select * From Jouw_Tabel Where Id Between A and B' Order By ..
        Open;
     end
     else
     begin
         ShowMessage('Geen resultaat gevonden ..');
         Close;
         Free;
     end:
   end;
Re: Sql vraagje
#1136
Author: Wim Godden
Date: Fri, 28 Oct 2005 00:03
59 lines
2088 bytes
In 1 query kan dit niet, met een subquery wel :

select
    *
from
    tabelnaam
where
    id=(
        select
            id
        from
            tabelnaam
        where
            id<X
        order by
            id desc
        limit
            1
    )
    or
    id=X
    or
    id=(
        select
            id
        from
            tabelnaam
        where
            id>X
        order by
            id asc
        limit
            1
    )
order by
    id asc

Steven wrote:

> Hallo,
>
> ik heb een vraagje ivm queries.
> Stel, je hebt een tabel met een aantal records. De tabel heeft een veld
> id. Ik wil nu van die tabel 3 records: het record met id = X, het record
> dat, geordend volgens id, juist voor X komt, en het record er juist na.
>
> Je kan dit uiteraard oplossen met meerdere queries, maar ik vroeg me
> toch af of het niet kon met slechts 1 query.
>
> Merk op dat de id's uniek zijn, maar niet noodzakelijk opeenvolgend.
>
> Je kan in de tabel bijvoorbeeld hebben: 1, 2, 17, 18, 19, 25, 26
> als X = 19, dan zou je 18, 19 en 25 moeten krijgen als oplossing.
>
> Iemand een oplossing ?
>
> Groetjes,
>
> Steven
Re: Sql vraagje
#1137
Author: Steven
Date: Fri, 28 Oct 2005 09:43
31 lines
2211 bytes
John Bokma wrote:
> Steven <user@example.net> wrote:
>  
> 
>>Ik denk niet dat dat correct is. Je bent immers niet zeker of het id
>>met X - 1 bestaat. het id dat net voor 19 komt, is kleiner dan 19,
>>maar je weet de exacte waarde niet. De id's zijn niet noodzakelijk
>>opeenvolgend. Toch bedankt. Nog suggesties?
> 
> 
> Waarom zit je tabel zo inelkaar (just curious)?
> 
> Je kan met een ordening op ID en een limit wel id, plus de volgende vinden 
> (limit op 2 zetten), maar geen idee hoe je in 1x alle drie op kan halen.
> 

Dat is gewoon een tabel met records, met een auto_increment op het id, 
en die records kan je verwijderen, daarom dat de id's niet noodzakelijk 
opeenvolgend zijn.

Met subqueries lukt het idd wel, maar dat ondersteunt mijn versie van 
MySQL niet.

Enfin, het is nu wel opgelost met meerdere queries, dus 't is geen ramp. 
Ik wou gewoon even weten als er hier iemand toch een oplossing had.

Iedereen bedankt voor zijn bijdrage.

Groetjes,

Steven
Re: Sql vraagje
#1138
Author: John Bokma
Date: Fri, 28 Oct 2005 11:09
24 lines
2028 bytes
Steven <user@example.net> wrote:

> John Bokma wrote:

>> Waarom zit je tabel zo inelkaar (just curious)?
> 
> Dat is gewoon een tabel met records, met een auto_increment op het id,
> en die records kan je verwijderen, daarom dat de id's niet
> noodzakelijk opeenvolgend zijn.

Ok, afhankelijk van hoevaak dingen gewist worden, en hoe snel je het zoeken 
wilt hebben kan je b.v. de vorige en voorgaande relatie in het record zelf 
opslaan. Dit brengt wel extra last met zich mee als je gaat wissen, maar 
als het opzoeken heel vaak voorkomt kan dit een stuk sneller zijn.

> Enfin, het is nu wel opgelost met meerdere queries,

Wel opletten dat er dan net eentje (record) gewist kan zijn, oops...

-- 
John Bokma
                 Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Ervaren Perl / Java programmeur beschikbaar:  http://castleamber.com/
Tevreden opdrachtgevers:     http://castleamber.com/testimonials.html
Re: Sql vraagje
#1141
Author: Kristoffel
Date: Fri, 28 Oct 2005 23:27
10 lines
1591 bytes
Steven wrote:
> 
> Met subqueries lukt het idd wel, maar dat ondersteunt mijn versie van 
> MySQL niet.
> 

Tijd voor een upgrade naar MySQL 4.1 of MySQL 5.0

--
  Kristoffel
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads