0

私が実行するとき:

SELECT t.testname , r.testrange 
FROM test as t 
LEFT JOIN range r ON t.test_id = r.test_id  
WHERE  r.test_id = 25;

以下のような結果が得られました:-

    +-----------+---------------------+
    | testname  | testrange           |
    +-----------+---------------------+
    | A:G RATIO | 15-20 for children  |
    | A:G RATIO | 30-60 for adults    |
    | A:G RATIO | 100 - 200 for women |
    +-----------+---------------------+

ご覧のとおり、testnameは最初の列で繰り返されています。では、どうすればこのような結果を得ることができますか?

    +-----------+---------------------+
    | testname  | testrange           |
    +-----------+---------------------+
    | A:G RATIO | 15-20 for children  |
    |    --     | 30-60 for adults    |
    |    --     | 100 - 200 for women |
    +-----------+---------------------+

つまり、一意のtestnameのみが、testrange列のすべてのtestrangeとともにtestname列に入力する必要があります。

4

2 に答える 2

1

ユーザー定義変数を使用して、行番号の値を各行に割り当てることができるため、コードは次のようになります。

select 
  case when rn = 1 then testname else '' end testname,
  testrange
from
(
  select t.testname,
    r.testrange,
    @row:=case when @prev=t.testname then @row else 0 end +1 rn,
    @prev:=testname
  FROM test as t 
  LEFT JOIN `range` r ON t.test_id = r.test_id  
  cross join (select @row:=0, @prev:=null) c
  WHERE  r.test_id = 25
  order by t.testname
) src
order by rn

デモで SQL Fiddle を参照してください

于 2013-03-14T10:49:57.217 に答える
0

1行が必要な場合は、結果を取得した後にグループ連結を使用する必要があります。列を分解できます。

SELECT
  t.testname,
  GROUP_CONCAT(r.testrange) AS testrange
FROM test as t
  LEFT JOIN range r
    ON t.test_id = r.test_id
WHERE r.test_id = 25
GROUP BY r.testrange;

あなたが望む出力は奇妙に思えます。ここでデモを参照してください。

于 2013-03-14T11:22:24.280 に答える