2017-05-27 87 views
1

我有兩個表爲:如何編寫查詢爲MySQL

mysql> select * from survey; 
+-----------+-----------+----------+--------+-----------+ 
| survey_id | client_id | stage_id | by_ref | no_branch | 
+-----------+-----------+----------+--------+-----------+ 
|   2 |  65 |  72 | P  | 15  | 
|   3 |  67 |  72 | D  | 2   | 
+-----------+-----------+----------+--------+-----------+ 
2 rows in set (0.07 sec) 

mysql> select * from allcode where code_type="MARKETING_STAGES"; 
+------------------+---------+------+--------------------+ 
| code_type  | code_id | srno | code_name   | 
+------------------+---------+------+--------------------+ 
| MARKETING_STAGES |  72 | 1 | Enquiry   | 
| MARKETING_STAGES |  73 | 3 | Meeting   | 
| MARKETING_STAGES |  74 | 4 | Presentation  | 
| MARKETING_STAGES |  75 | 5 | Review/Follow up | 
| MARKETING_STAGES |  76 | 6 | Negotiation  | 
| MARKETING_STAGES |  77 | 7 | Order    | 
| MARKETING_STAGES |  78 | 8 | Agreement   | 
| MARKETING_STAGES |  162 | 9 | Complete   | 
| MARKETING_STAGES |  163 | 2 | Tender    | 
+------------------+---------+------+--------------------+ 
9 rows in set (0.04 sec) 

我想更新調查表下一個值將從allcodecode_id來取的stage_id
現在我有client_id即65從survey表,並希望更新stage_id

什麼我都試過,直到爲

(即 下一頁從allcode表上排序基於srno code_id)
update survey as s 
set s.stage_id= 
(select code_id from allcode 
where code_id > (select stage_id from (select * from survey where client_id=65)as su) 
and code_type="MARKETING_STAGES" 
limit 1) 
where client_id=65; 

我希望它更新到該查詢更新stage_idallcode到和(根據srno

+0

Allcode表沒有code_type場。您的查詢非常複雜,充滿了不必要的子查詢。 – Shadow

+0

使它簡單我已將它刪除 –

+1

很難說 - 但它會更容易改變它,所以stage_id是srno,所以,而不是這個尷尬的翻譯,你只需在這個表(我認爲)步驟號。 –

回答

2

我會用連接在更新,我們將根據srno下一個code_id

update survey s 
inner join allcode a1 on s.stage_id=a1.code_id 
inner join allcode a2 on a1.srno=a2.srno-1 
set s.stage_id=a2.code_id 
where a1.code_type='MARKETING_STAGES' and a2.code_type='MARKETING_STAGES' and s.client_id=65 

我假定由1 srno場爲單位進行,沒有任何縫隙。第一次連接的目的是獲取當前的stage_id的srno。然後第二個連接獲取下一個srno的stage_id。

+0

我會盡力讓你知道 –

+0

它的工作,會測試並讓你知道是否有問題 –

+0

絕對比其他答案更好,因爲它不僅解決了問題,而且更有效地做到了。 – Utsav

0

您在子查詢中在limit之前缺少order by

所以不碰你查詢的其餘部分,我只是想增加一個order by,似乎更新來自72第一stage id163你想要的。

Rextester Demo

update survey as s 
set s.stage_id= 
(select code_id from allcode 
where code_id > (select stage_id from (select * from survey where client_id=65)as su) 
and code_type="MARKETING_STAGES" 
ORDER BY SRNO 
limit 1) 
where client_id=65; 
+0

爲什麼每個演示的投票都像OP想要的那樣? – Utsav

+0

不能重複使用 –

+0

它很複雜且充滿了不必要的子查詢。 – Shadow