1

ケースの選択に問題があります..

テーブル

  1. テンプレート(temp_id、temp_title、temp_applyto、temp_status、start_date、end_date)

    [temp_applyto store int 1-individu、2-branch、3-dept、4-position]

  2. 個別(applyto_id、applyto_individu、applyto_temp)

  3. ブランチ(applyto_id、applyto_branch、applyto_temp)

  4. 部署 ( applyto_id、applyto_dept、applyto_temp)

  5. 位置(applyto_id、applyto_position、applyto_temp)

  6. スタッフ(ID、名前、支店、部署、役職)

説明:

ユーザーが個別、支店、部署、または役職のテーブルにいるかどうかを確認したい。temp_applyto (テーブル テンプレート) = 1の場合、ユーザーが存在する場合は個別にテーブルを確認したい、 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

そして、私はこのエラーを受け取ります:サブクエリは複数の行を返します

4

2 に答える 2

0

サブクエリの 1 つが複数の行を返すため、エラーは明らかです。各サブクエリで使用でき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
于 2013-08-21T08:37:29.447 に答える
0

エラーは一目瞭然です。サブクエリの 1 つが複数の行を返します。問題を解決するにはいくつかの方法があります。簡単な方法の 1 つは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

これにより、1 つの数値が返されます。一致がない場合は 0、一致する場合はその数が返されます。

于 2013-08-21T08:43:05.743 に答える