3

次のようなテーブルがあります。

table: Q
---------------------------
|question| scope |  type  |
---------------------------
|  this  |   A   |   1    |
|  that  |   A   |   1    |
|  them  |   A   |   1    |
---------------------------
|  this  |   A   |   2    |
|  that  |   A   |   2    |
|  them  |   A   |   2    |
---------------------------
|  this  |   B   |   1    |
|  that  |   B   |   1    |
|  them  |   B   |   1    |
---------------------------

スコープを指定する必要があり、各タイプから 2 つのエントリを抽出する必要があります。スコープが A の場合、考えられる解決策は次のとおりです。

---------------------------
|  this  |   A   |   1    |
|  them  |   A   |   1    |
---------------------------
|  that  |   A   |   2    |
|  this  |   A   |   2    |
---------------------------

現在、次の SQL ステートメントを使用しています。

SELECT tmp.question, tmp.type, tmp.scope
FROM Q
LEFT JOIN (
SELECT * FROM Q ORDER BY RAND( )
)tmp ON ( Q.type = tmp.type AND tmp.scope = 'A' ) 
GROUP BY tmp.type
ORDER BY Q.type

ただし、これはタイプごとに 1 つのエントリのみを返し、何らかの理由で NULL 行を返します。
したがって、私の質問は、ステートメントを最適化して 2 つの行を返し、NULL の行を削除する方法です。

4

2 に答える 2

2

ランクを 2 から、各カテゴリで獲得したいものに変更できます。

http://www.sqlfiddle.com/#!2/f3946/86

これを試して:

  SELECT x.question,
       x.scope,
       x.type
  FROM (

    SELECT bp.question, bp.scope, bp.type, 
    CASE WHEN bp.type = @type 
         THEN @rownum := @rownum + 1
         ELSE @rownum := 1
         END AS rank,
    @type := bp.type
FROM (select * from Q order by rand()) bp
JOIN (SELECT @rownum := 0, @type := NULL) r
WHERE bp.scope = 'A'
ORDER BY type
    ) x
 WHERE x.rank <= 2
order by x.type

注:古い回答を使用し、ランダム化を改善しました。私が助けを得た古い答えは次のとおりです。 各カテゴリのNレコードを選択し、Xで並べ替えます

于 2012-09-01T20:10:24.827 に答える
0

SqlFiddle :

(
  SELECT question, scope, type FROM Q
  WHERE  scope = 'A' AND type = 1
  ORDER BY RAND() LIMIT 2
)
UNION
(
  SELECT question, scope, type FROM Q
  WHERE  scope = 'A' AND type = 2
  ORDER BY RAND() LIMIT 2
)
于 2012-09-01T19:47:39.760 に答える