2013-08-21 89 views
1

我有選擇的情況下的問題..MySQL查詢選擇的情況下更然後1個表

  1. 模板(temp_id,TEMP_TITLE,temp_applyto,temp_status,日期,結束日期)

    [其中temp_applyto存儲int 1-individual,2-branch,3-dept和4-position]

  2. individu(applyto_id,applyto_individu,applyto_temp)

  3. 分支(applyto_id,applyto_branch,applyto_temp)

  4. 部門(applyto_id,applyto_dept,applyto_temp)

  5. 職位(applyto_id,apply to_position,applyto_temp)

  6. 人員(ID,姓名,分公司,部門,職務)

說明:

我要檢查用戶是否他在表individu,分支,部門或職位。如果temp_applyto(表模板)= 1然後我想要查詢表individu如果用戶存在,如果temp_applyto = 2然後我想如果用戶存在和相同的推移檢查表分支

查詢至今:

SELECT (CASE WHEN temp_applyto=1 
    THEN (SELECT applyto_temp FROM individu 
      WHERE applyto_individu=$user) 
    WHEN temp_applyto=2 
    THEN (SELECT a.applyto_temp FROM branch a, staff b 
      WHERE >a.applyto_branch=b.branch AND b.id=$user) 
    WHEN temp_applyto=3 
    THEN (SELECT a.applyto_temp FROM dept a, staff b 
      WHERE >a.applyto_dept=b.dept AND b.id=$user) 
    WHEN temp_applyto=4 THEN (SELECT a.applyto_temp FROM position a, staff b 
      WHERE a.applyto_position=b.position AND b.id=$user) 
    ELSE 0 end) as template_temp 
FROM template 
WHERE '2013-08-21' BETWEEN start_date AND end_date 

和我得到這個錯誤:子查詢返回多個1行

回答

0

的錯誤是顯而易見的,因爲我們的子查詢的一個返回不止一行。您可以在每個子查詢上使用LIMIT 1。但是,如果你想獲得多行,你可以使用UNION這樣

SELECT template_temp FROM 
(
    (SELECT applyto_temp AS template_temp, 1 AS temp_applyto FROM individu WHERE applyto_individu = $user) UNION 
    (SELECT a.applyto_temp AS template_temp, 2 AS temp_applyto FROM branch a, staff b WHERE a.applyto_branch=b.branch AND b.id=$user) UNION 
    (SELECT a.applyto_temp AS template_temp, 3 AS temp_applyto FROM dept a, staff b WHERE a.applyto_dept=b.dept AND b.id=$user) UNION 
    (SELECT a.applyto_temp AS template_temp, 4 AS temp_applyto FROM `position` a, staff b WHERE a.applyto_position=b.`position` AND b.id=$user) 
) AS combine INNER JOIN template 
ON (combine.temp_applyto = template.temp_applyto) 
WHERE '2013-08-21' BETWEEN start_date AND end_date 
+0

謝謝invisal和Aleks G的快速回復...我已經測試你的查詢,但invisal查詢返回0行,是的,我想返回多1行。有沒有其他解決方案? – achimet

+0

返回0查詢沒有任何錯誤?是否有可能在本網站http://sqlfiddle.com/中構建您的示例數據庫。我們測試並找到解決方案要容易得多。 – invisal

+0

對不起invisal ..它的工作..我的壞。但我想問你的東西..那麼如果我有temp_applyto(表模板)= 0適用於所有用戶,並沒有像其他人的表。我嘗試把(選擇temp_id AS template_temp,0 AS temp_applyto從模板)..我可以這樣做嗎? – achimet

0

的錯誤是相當不言自明的:你的子查詢返回一個比一個多排。有幾種方法可以解決您的問題。一個簡單的方法是將LIMIT 1添加到每個子查詢中。或者,您可以子選擇的行數 - 然後將結果進行比較,以0:

SELECT (CASE WHEN temp_applyto=1 
    THEN (SELECT COUNT(*) FROM individu 
      WHERE applyto_individu=$user) 
    WHEN temp_applyto=2 
    THEN (SELECT COUNT(*) FROM branch a, staff b 
      WHERE >a.applyto_branch=b.branch AND b.id=$user) 
    WHEN temp_applyto=3 
    THEN (SELECT COUNT(*) FROM dept a, staff b 
      WHERE >a.applyto_dept=b.dept AND b.id=$user) 
    WHEN temp_applyto=4 
    THEN (SELECT COUNT(*) FROM position a, staff b 
      WHERE a.applyto_position=b.position AND b.id=$user) 
    ELSE 0 END) as template_temp 
FROM template 
WHERE '2013-08-21' BETWEEN start_date AND end_date 

這將返回一個數字 - 0,如果沒有匹配或匹配的數量,如果有任何。

+0

tq Aleks G ..我會稍後再試 – achimet

相關問題