如何在MySQL中选择不同的行?

时间:2013-03-14 10:39:07

标签: mysql

当我表演时:

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应该在testname列中以及它们在testrange列中的所有测试范围。

2 个答案:

答案 0 :(得分: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 with Demo

答案 1 :(得分:0)

如果你需要一行,你应该在获得结果后使用group concat,你可以爆炸列。

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;

你想要的输出看起来很奇怪。请参阅演示here