2011-10-24 41 views
2

獲得排X號從question我早些時候提出的後續行動,我做了下面的查詢,但它不能限制某些行的數量從每個組,集團的網頁,並從每個組

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 

結果,

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 

但我希望得到這個結果,

結果,

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 

任何想法,我已經錯過了?

EDIT 1:

查詢,

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 

結果,

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 

查詢,

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 

結果,

page_id page_url group_title page_created row_number 
---------------------------------------------------------- 
44  abc   {a}   2011-10-21... 1 
43  def   {a}   2011-10-21... 2 

查詢,

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 

結果,

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 

編輯2:

查詢,

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 

結果,

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 

答:

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 

回答

1

您的查詢未初始化變量@row_number

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 

否則,您需要之前使用SET聲明查詢你發佈。

其次,你貼什麼不包括必要的CASE語句讓你獲得1+每個page_url

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, 
       @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_url, p.page_backdate DESC) a 
WHERE a.row_number <= 2 

IME重置變量,變量適用於InnoDB表,但沒有對MyISAM數據一致。

+0

謝謝。第一個查詢顯示行號,但第二個查詢不顯示行號。但是,第一個查詢仍然不會返回我之後的查詢,因爲行號是 - '1,2,3,4,5,6,7'請參閱上面的我的編輯。 – laukok

+0

@lauthiamkok:啊,你想要'group_title'上的排名。必須跑步去工作,但你應該有足夠的工作,直到我下班回家。 –

+0

我試過了,但是我在編號行中得到了'1,1,1,1,1,1,1'請看我上面的編輯。謝謝。 – laukok