如何根据加入查询结果生成id

时间:2015-06-09 05:35:26

标签: php mysql

我需要列出计数数据和基于“速率”值的两个表格。

费率表

 id    rate    ratevale
 -------------------------    
  1     N        NA    
  2     D        DH    
  3     F        FA    
  4     L        LD

索赔表

id  rate

1    N

2    N

3    N

4    F

5    N

6    D

7    D

8    F

9    L

我需要列出以下结果

id  Generate

1   NA-40-001

2   NA-40-002

3   NA-40-003

4   FA-40-001

5   NA-40-004

6   DH-40-001

7   DH-40-002

8   FA-40-002

9   LD-40-001

我按照

进行了查询
$query="select count(Claim.rate) as count,Rate.ratevale from Claim leftjoin Rate on Claim.rate=Rate.rate group by Claim.rate";

显示每个“费率和费率值”的计数,如下所示

NA->4

FA->2

DH->2

LD->1

但我需要如何列出格式以上的数据。

2 个答案:

答案 0 :(得分:0)

试用此代码:

$query="SELECT COUNT( Claim.rate ) AS count, Rate.ratevale
FROM claim
LEFT JOIN rate ON Claim.rate = Rate.rate
GROUP BY Claim.rate" ;

使用Order By

$query = "SELECT COUNT( claim.rate ) AS count, rate.ratevale
FROM claim
LEFT JOIN rate ON claim.rate = rate.rate
GROUP BY claim.rate
ORDER BY count DESC" ; 

答案 1 :(得分:0)

使用表格

CREATE TABLE ctab (id int,rate varchar(1)); -- claims table
INSERT INTO ctab (id,rate) VALUES
    (1, 'N'),(2, 'N'),(3, 'N'),(4, 'F'),(5, 'N'),
    (6, 'D'),(7, 'D'),(8, 'F'),(9, 'L');

CREATE TABLE rtab(id int,rate varchar(1), ratevale varchar(2));
INSERT INTO rtab (id,rate,ratevale) VALUES  -- rates table
    (1, 'N', 'NA'),(2, 'D', 'DH'),(3, 'F', 'FA'),(4, 'L', 'LD');

我们可以做到以下几点:

SELECT t.id, CONCAT(ratevale,'-40-',RIGHT(CAST(i+1000 as char(4)),3)) rval
FROM (
 SELECT CASE WHEN @r =rate THEN @i:=@i+1 ELSE @i:= 1 END i,
        CASE WHEN @r!=rate THEN @r:=rate ELSE @r     END r, 
 id id,rate rate 
 FROM (SELECT @i:=1,@r:='') v, ctab c 
 ORDER BY rate,id
) t 
INNER JOIN rtab r ON r.rate=t.rate
ORDER BY id

我们得到:

| id |      rval |
|----|-----------|
|  1 | NA-40-001 |
|  2 | NA-40-002 |
|  3 | NA-40-003 |
|  4 | FA-40-001 |
|  5 | NA-40-004 |
|  6 | DH-40-001 |
|  7 | DH-40-002 |
|  8 | FA-40-002 |
|  9 | LD-40-001 |

在此处使用它:http://sqlfiddle.com/#!9/d9e3e/15

基本思路是我们列出声明表,按rate排序并将其转换为派生表t

在派生表@i中初始化1@r''v,我们会检查@r=rate

  • 如果是,我们会增加@i
  • 否则(ELSE)我们将@i重置为1,将@r重置为rate。 这发生在第二个CASE子句中。

我们最终得到一个序列列i,它开始计算rate的每个值。在外部SELECT语句中,派生表t随后会加到费率表rtab,并应用不同的排序顺序。

请注意:

此解决方案也可视为ROW_NUMBER() in MySQL的替代解决方案。上面的MySQL查询可以通过应用row_number() over (partition...)轻松地在MSSQL中重写,请参见此处:http://sqlfiddle.com/#!3/d9e3e/8