Following up from the question I made earlier, I made the query below but it cannot limit certain number of row from each group,
SELECT *
FROM (SELECT p.page_id AS page_id,
p.page_url AS page_url,
SUBSTRING(p.page_title,LOCATE('{',p.page_title),LOCATE('}',p.page_title)) AS group_title,
p.page_created AS page_created,
@row_number := @row_number + 1 AS row_number
FROM root_pages AS p
WHERE p.parent_id = '8'
AND p.page_id != '8'
AND p.page_hide != '1'
AND p.category_id = '1'
ORDER BY p.page_backdate DESC) a
WHERE row_number <= 2
result,
page_id page_url group_title page_created row_number
----------------------------------------------------------
44 abc {a} 2011-10-21... NULL
43 def {a} 2011-10-21... NULL
42 qwe {b} 2011-10-21... NULL
41 rty {b} 2011-10-21... NULL
40 tyu {c} 2011-10-21... NULL
39 ghj {c} 2011-10-21... NULL
59 sss {c} 2011-10-21... NULL
But I want to get this as the result,
result,
page_id page_url group_title page_created row_number
----------------------------------------------------------
44 abc {a} 2011-10-21... 1
43 def {a} 2011-10-21... 2
42 qwe {b} 2011-10-21... 1
41 rty {b} 2011-10-21... 2
40 tyu {c} 2011-10-21... 1
39 ghj {c} 2011-10-21... 2
Any idea where I have missed?
EDIT 1:
Query,
SELECT a.*
FROM (SELECT p.page_id,
p.page_url,
SUBSTRING(p.page_title, LOCATE('{',p.page_title),LOCATE('}', p.page_title)) AS group_title,
p.page_created,
@row_number := @row_number + 1 AS row_number
FROM root_pages AS p
JOIN (SELECT @row_number := 0, @url) r -- Initialize the variable
WHERE p.parent_id = '8'
AND p.page_id != '8'
AND p.page_hide != '1'
AND p.category_id = '1'
ORDER BY p.page_backdate DESC) a
result,
page_id page_url group_title page_created row_number
----------------------------------------------------------
44 abc {a} 2011-10-21... 1
43 def {a} 2011-10-21... 2
42 qwe {b} 2011-10-21... 3
41 rty {b} 2011-10-21... 4
40 tyu {c} 2011-10-21... 5
39 ghj {c} 2011-10-21... 6
59 sss {c} 2011-10-21... 7
Query,
SELECT a.*
FROM (SELECT p.page_id,
p.page_url,
SUBSTRING(p.page_title, LOCATE('{',p.page_title),LOCATE('}', p.page_title)) AS group_title,
p.page_created,
@row_number := @row_number + 1 AS row_number
FROM root_pages AS p
JOIN (SELECT @row_number := 0, @url) r -- Initialize the variable
WHERE p.parent_id = '8'
AND p.page_id != '8'
AND p.page_hide != '1'
AND p.category_id = '1'
ORDER BY p.page_backdate DESC) a
WHERE a.row_number <= 2
result,
page_id page_url group_title page_created row_number
----------------------------------------------------------
44 abc {a} 2011-10-21... 1
43 def {a} 2011-10-21... 2
Query,
SELECT *
FROM(
SELECT
p.page_id AS page_id,
p.page_url AS page_url,
SUBSTRING(p.page_title,LOCATE('{',p.page_title),LOCATE('}',p.page_title)) AS group_title,
p.page_created AS page_created,
@url = p.page_url,
@row_number := CASE
WHEN p.page_url = @url THEN @row_number + 1
ELSE 1
END AS row_number
FROM root_pages AS p
JOIN (SELECT @row_number := 0, @url) r -- Initialize the variable
WHERE p.parent_id = '8'
AND p.page_id != '8'
AND p.page_hide != '1'
AND p.category_id = '1'
ORDER BY p.page_backdate DESC
) a
where row_number <= 2
result,
page_id page_url group_title page_created row_number
----------------------------------------------------------
44 abc {a} 2011-10-21... 1
43 def {a} 2011-10-21... 1
42 qwe {b} 2011-10-21... 1
41 rty {b} 2011-10-21... 1
40 tyu {c} 2011-10-21... 1
39 ghj {c} 2011-10-21... 1
59 sss {c} 2011-10-21... 1
EDIT 2:
Query,
SELECT
a.*,
@r := CASE WHEN @g = a.group_title THEN @r+1 ELSE 1 END AS r,
@g := a.group_title AS dummy
FROM(
SELECT
p.page_id AS page_id,
p.page_url AS page_url,
SUBSTRING(p.page_title,LOCATE('{',p.page_title),LOCATE('}',p.page_title)) AS group_title,
p.page_created AS page_created
FROM root_pages AS p
WHERE p.parent_id = '8'
AND p.page_id != '8'
AND p.page_hide != '1'
AND p.category_id = '1'
ORDER BY p.page_backdate DESC
) a
JOIN (SELECT @r := 0, @g) r -- Initialize the variable
Result,
page_id page_url group_title page_created dummy row_number
44 abc {a} 2011-10-21... {a} 1
43 def {a} 2011-10-21... {a} 1
42 qwe {b} 2011-10-21... {b} 1
41 rty {b} 2011-10-21... {b} 1
40 tyu {c} 2011-10-21... {c} 1
39 ghj {c} 2011-10-21... {c} 1
59 sss {c} 2011-10-21... {c} 1
ANSWER:
SELECT *
FROM
(
SELECT
a.*,
@r := CASE WHEN @g = a.group_title THEN @r+1 ELSE 1 END AS r,
@g := a.group_title AS dummy
FROM(
SELECT
p.page_id AS page_id,
p.page_url AS page_url,
SUBSTRING(p.page_title,LOCATE('{',p.page_title),LOCATE('}',p.page_title)) AS group_title,
p.page_created AS page_created
FROM root_pages AS p
WHERE p.parent_id = '8'
AND p.page_id != '8'
AND p.page_hide != '1'
AND p.category_id = '1'
ORDER BY p.page_backdate DESC
) a
JOIN (SELECT @g:=null, @r:= 0) n -- Initialize the variable
) b
WHERE r <= 2
Your query didn’t initialize the
@row_numbervariable:Otherwise, you need to use a
SETdeclaration before the query you posted.Secondly, what you posted does not include the CASE statement necessary to reset the variable so you get 1+ for each
page_urlIME, the variable works on InnoDB tables but wasn’t consistent against MyISAM.