hi. i have database with two tables like this:
database=> \d groups
                           Table "groups"
 Attribute |  Type   |                   Modifier                   
-----------+---------+----------------------------------------------
 id        | integer | not null default nextval('groups_seq'::text)
 parent_id | integer | not null default 0
 image_id  | integer | not null default 0
 name      | text    | not null default ''

database=> \d g_order 
                           Table "g_order"
 Attribute |  Type   |                   Modifier                    
-----------+---------+-----------------------------------------------
 id        | integer | not null default nextval('g_order_seq'::text)
 group_id  | integer | not null default 0

data inside are (for test purposes):
database=> select * from groups;
 id | parent_id | image_id |         name         
----+-----------+----------+----------------------
  0 |         0 |        0 | 
  1 |         0 |        0 | RTV
  2 |         0 |        0 | AGD
  3 |         0 |        0 | MP3
  4 |         1 |        0 | Audio
  5 |         2 |        0 | Lodwki
  6 |         2 |        0 | Kuchenki Mikrofalowe
  7 |         4 |        0 | Sony
  8 |         4 |        0 | Panasonic
(9 rows)
database=> select * from g_order;
 id | group_id 
----+----------
  1 |        2
  2 |        6
  3 |        5
  4 |        3
  5 |        1
  6 |        4
  7 |        8
  8 |        7
(8 rows)

the table g_order allows me to change order of displaying groups without changing
main groups table. just like this:
database=> select g.id, getgrouppath(g.id,'/') from groups g, g_order o where
g.id = o.group_id order by o.id;
 id |       getgrouppath       
----+--------------------------
  2 | AGD
  6 | AGD/Kuchenki Mikrofalowe
  5 | AGD/Lodwki
  3 | MP3
  1 | RTV
  4 | RTV/Audio
  8 | RTV/Audio/Panasonic
  7 | RTV/Audio/Sony
(8 rows)
 
o.k. and now comes my problem:
i need to know which group (groups.id) is first (after ordering) subgroup of
group ... for example 4 (rtv/audio).
i'm doing it now with:
SELECT
  go.group_id
FROM
  g_order go
WHERE
  go.id = (
    SELECT
      min(o.id)
    FROM
      groups g,
      g_order o
    WHERE
      g.id = o.group_id and
      g.parent_id=4 and
      g.id <> 0
  )
;

but i feel that there should be a better/faster way to do it.
my tables have primary keys, foreign key (groups.id <=> g_order.group_id),
indices.

any idea how to write a better select to do what i need? or maybe the one i
wrote is the best one?

depesz

-- 
hubert depesz lubaczewski
------------------------------------------------------------------------
     najwspanialszą rzeczą jaką dało nam nowoczesne społeczeństwo,
      jest niesamowita wręcz łatwość unikania kontaktów z nim ...

Reply via email to