根据另外两个表

时间:2015-05-08 19:14:17

标签: php mysql

我已经创建了相应的表格:

CREATE TABLE IF NOT EXISTS StatusTable( 
    form_num INT not null auto_increment,  
    status VARCHAR(20) NOT NULL,
    primary key (form_num),
    FOREIGN KEY Status(form_num) REFERENCES Requests(reg_num)

CREATE TABLE IF NOT EXISTS Requests( 
    reg_num INT not null auto_increment, 
    ama VARCHAR(20) NOT NULL, 
    afm VARCHAR(9) NOT NULL, 
    description VARCHAR(100) NOT NULL, 
    est_cost FLOAT NOT NULL,
    primary key(reg_num),
    FOREIGN KEY Requests(afm) REFERENCES Citizens(afm)

CREATE TABLE IF NOT EXISTS Tax_data( 
    afm VARCHAR(9) NOT NULL primary key,
    ama VARCHAR(20) NOT NULL

现在,我想从表StatusTable中选择具有特定状态值的行。

从这些记录中,如果afm,则两个表中的ama请求和Tax_data更新状态都有效,否则如果它们仅存在于请求中而不存在于Tax_data更新状态中则无效。

例如:

StatusTable |   Requests |  Tax_data |
1  pending  | 1 01 001...|   01 001  |
2  valid    | 2 02 002...|   02 002  |
3  invalid  | 3 03 003...|   03 004  |
4  pending  | 4 04 004...|   04 008  |

我想从StatusTable中选择(1个待处理的),(4个,待处理的)以及来自请求的(1 01 001 )是否与( 01 001 )相同从Tax_data将状态从挂起更改为有效。如果它与( 04 004 )不同,则将状态从待处理更改为无效。

我怎么能用php和mysql做到这一点?有任何想法吗?我觉得有点复杂。

1 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,您可以使用outer joincase语句来确定新状态:

select r.reg_num, s.status, r.ama, r.afm, t.ama, t.afm,
       case when t.afm is not null then 'Valid' 
            else 'Invalid'  
       end newstatus
from statustable s
    join requests r on s.form_num = r.req_num
    left join tax_data t on t.ama = r.ama and t.amf = r.amf
where s.status = 'Pending'

如果您需要更新status表,这应该有效:

update statustable s
join requests r on s.form_num = r.req_num
left join tax_data t on t.ama = r.ama and t.amf = r.amf
set s.status = 
       case when t.afm is not null then 'Valid' 
            else 'Invalid'  
       end
where s.status = 'Pending'