[ glamoc @ 01.11.2010. 08:17 ] @
Uprosceni model moje baze sastoji se od dve tabele

Code:
CREATE TABLE `categories`(
`cat_id` INT AUTO_INCREMENT NOT NULL,
`cat_title` VARCHAR(30) NOT NULL,
PRIMARY KEY(`cat_id`)
);

i
Code:
CREATE TABLE `forums`(
`forum_id` INT AUTO_INCREMENT NOT NULL,
`forum_title` VARCHAR(30) NOT NULL,
`cat_id` INT,
FOREIGN KEY `cat_id` REFERENCES categories(`cat_id`),
PRIMARY KEY(`forum_id`)
);


Ja hocu da vratim npr prvih n foruma iz svake kategorije i nasao sam neki upit koji obavlja ovo

Code:
    SELECT 
        cat_title,
        forum_title,
        cat_id,
        forum_id,
        @x:=CASE WHEN @y <> cat_id THEN 0 ELSE @x+1 END AS rn,
        @y:=cat_id
    FROM 
        (SELECT
            c.cat_id,
            c.cat_title,
            f.forum_id,
            f.forum_title
        FROM forums as f,categories as c WHERE f.cat_id=c.cat_id) c,
        (SELECT @x:=-1) a,
        (SELECT @y:=1) b


Ovo sto mi nije bas najjasnije su ove promenljive i to
Code:
 @x:=CASE WHEN @y <> cat_id THEN 0 ELSE @x+1 END AS rn,
          @y:=cat_id

Kako uopste ikada @y moze biti razlicito od cat_id kad @y upravo uzima vrednost cat_id.

Samo da napomenem da upit koristim za nesto drugo sa puno komplikovanijim tabelama a ovde sam radi jednostavnosti uprostio stvari ali sustina je ista.
[ Nikola Poša @ 01.11.2010. 09:49 ] @
Citat:
glamoc: Kako uopste ikada @y moze biti razlicito od cat_id kad @y upravo uzima vrednost cat_id.

Pa može kad naiđe red sa nekom drugom kategorijom, tačnije, red koji sadrži id kategorije različit od nekog prethodnog reda.
[ Nikola Poša @ 01.11.2010. 10:12 ] @
btw Možda ti je ovakav upit lakši za razumevanje:
Code:
SET @br:=0, @trenutni_cat_id:=0;

SELECT rezultat.forum_id, rezultat.forum_title, rezultat.cat_id, rezultat.cat_title,
   IF(@trenutni_cat_id != rezultat.cat_id, @br:=1, @br:=@br+1) AS broj_redova, 
   IF(@trenutni_cat_id != rezultat.cat_id, @trenutni_cat_id:=rezultat.cat_id, 0)
FROM (
    SELECT f.forum_id, f.forum_title, c.cat_id, c.cat_title
    FROM categories c, forums f
    WHERE f.cat_id = c.cat_id
    ORDER BY c.cat_id, f.forum_id
) AS rezultat
HAVING broj_redova <= 2

To će ti dati po dva foruma iz svake kategorije, sortirana po njihovom id-u.