0

夜、

MySQL でグループあたりnに制限されている行の出力を取得しようとしています。結合なしで動作させることはできますが、結合すると恥ずかしがり屋です。関連するテーブルのダンプをここに貼り付けました。

http://pastebin.com/6F0v1jhZ

私が使用しているクエリは次のとおりです。

SELECT
   title, catRef, RowNum, pCat, tog
FROM
(
    SELECT
        title, catRef,
        @num := IF(@prevCat=catRef,@num+1,1) AS RowNum,
        @prevCat AS tog,
        @prevCat := catRef AS pCat
    FROM (select @prevCat:=null) AS initvars
    CROSS JOIN 
    (
        SELECT p.title, oi.catRef
        FROM resources p
        INNER JOIN placesRel v ON (p.resId = v.refId)
        INNER JOIN catRel oi ON (p.resId = oi.refId)
        WHERE p.status = 'live' AND v.type = 'res' AND oi.type = 'res'
    ) AS T
) AS U
WHERE RowNum <= 5
ORDER BY catRef

行数を増やすことができません。または、他のソリューションをいただければ幸いです。

私はこのような結果を探しています:

title        catRef        RowNum
Title1       1             1
Title2       1             2
Title3       1             3
Title4       2             1
Title5       2             2
Title6       3             1

現時点では、RowNum 列は常に 1 です。

4

1 に答える 1

0

これは機能します:

SET @num := 1, @prevCat := 0;
SELECT title, start, end, type, description, linkOut, outType, catRef, row_number
FROM (
SELECT title, start, end, type, description, linkOut, outType, catRef,
@num := if(@prevCat = catRef, @num + 1, 1) as row_number,
@prevCat AS tog,
@prevCat := catRef AS dummy
FROM (
    SELECT title, start, end, resources.type, description, linkOut, outType, catRef
    FROM resources LEFT JOIN placesRel ON placesRel.refId = resId LEFT JOIN catRel ON catRel.refId = resId
    WHERE status = 'live' AND placesRel.type = 'res' AND catRel.type = 'res'
    ORDER BY catRef
) AS w
) AS x WHERE x.row_number <= 4;

結合されたクエリをサブクエリに入れて、グループ化する列で並べ替える必要があります。親クエリを使用して行番号を追加します。次に、トップレベルのクエリがすべてを結び付けます。

結合されたクエリを独自のサブクエリに入れない場合、結果は希望どおりに並べ替えられず、代わりにデータベースにある順序で出力されます。これは、データがグループ化されていないことを意味するため、行番号は順序付けられた行に適用されません。

于 2012-05-23T13:06:48.580 に答える