当我表演时:
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列中的所有测试范围。
答案 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
答案 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。