mysql根据行名选择/创建唯一ID

时间:2012-04-08 03:54:25

标签: mysql select

这是我的数据库表。我怎样才能从数据库表中选择底部表?

是否可以从唯一的名称和类型创建NameID和TypeID?

EDIT --- 我有使用案例的类型,因为只有3种类型。

SELECT 
  name, type, spending, 
    CASE type 
       WHEN 'Credit Card' THEN 1 
       WHEN 'Cash' THEN 2 
       WHEN 'Cheque' THEN 3 
    END AS typeID_  
FROM spendtable

是否可以在名称列上执行相同的操作?

谢谢!

----数据库表----

  

名称类型   消费
约翰信用卡550
Brian Cash   200
弗兰克检查   600
约翰卡什   150
约翰   现金300
  弗兰克信贷   卡200

----表需要----

  

NameID名称TypeID类型   支出
1   约翰1张信用卡   550
2   布莱恩2   现金200
3弗兰克3检查   600
1约翰2现金    150个
  1约翰2现金    300个
  3 Frank 1信用卡200   

------- EDIT

我最终使用2个查询和php来获取所需的表

 function getInfo(){   
     SELECT 
       name, type, spending, 
         CASE type 
            WHEN 'Credit Card' THEN 1 
            WHEN 'Cash' THEN 2 
            WHEN 'Cheque' THEN 3 
         END AS typeID_  
     FROM spendtable 
 }

 function getName(){   
       SELECT name    
       FROM spendtable   
       GROUP BY share_ ASC           
 }


$info_array = $this->getInfo(); 
$name_array = $this->getName(); 

 for($i=0; $i<count($info_array); $i++){   
   $info_array[$i]['nameID'] = '';   
     for($j=0; $j<count($name_array); $j++){
     if($info_array[$i]['nameID'] == $name_array[$j]){
       $info_array[$i]['nameID'] = $j;
     }   
   }         
}

1 个答案:

答案 0 :(得分:0)

我能够扩展您现有的查询以支持NameID列:

SELECT 
  name, type, spending, 
    CASE type 
       WHEN 'Credit Card' THEN 1 
       WHEN 'Cash' THEN 2 
       WHEN 'Cheque' THEN 3 
    END AS TypeID, 
    CASE name 
       WHEN 'John' THEN 1 
       WHEN 'Brian' THEN 2 
       WHEN 'Frank' THEN 3 
    END AS NameID
FROM spendtable

作为设计限制,存储在数据库中的人员只能被命名为John,Brian或Frank:)

认真对待,假设存在未知的可能数量的名称,我不确定您是否可以(或者希望)在查询中执行此类处理。相反,请考虑维护一个单独的Name表来跟踪唯一名称:

NameID   Name
1        John
2        Brian
3        Frank

然后您的查询可以加入此表:

SELECT 
  s.name, s.type, s.spending, 
    CASE s.type 
       WHEN 'Credit Card' THEN 1 
       WHEN 'Cash' THEN 2 
       WHEN 'Cheque' THEN 3 
    END AS TypeID, 
    n.nameid
FROM spendtable s
JOIN Name n on n.name = s.name

当然这意味着你需要保持Name表的最新状态,确保为新名称插入行。