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

如果你需要一行,你应该在得到结果后使用 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;

你想要的输出看起来很奇怪。在此处查看演示。

于 2013-03-14T11:22:24.280 回答