2013-06-28 15 views
5

に参加する:使用しているときにエラーを取得すると、私はこのクエリを持っているクエリ

SELECT * FROM `employee_activities` a 
LEFT JOIN `activity` b ON a.activity_code = b.code 
LEFT JOIN `employees` c ON a.employee_code = c.code 
WHERE b.type = "Design" 
AND c.code NOT IN(
    SELECT * FROM `employee_activities` a 
     LEFT JOIN `activity` b ON a.activity_code = b.code 
     LEFT JOIN `employees` c ON a.employee_code = c.code 
     WHERE b.type = "Testing" 
) 
GROUP BY c.code 

私はこのエラーを取得する:

#1241 - Operand should contain 1 column(s) 

私はの少なくとも1つの活性を持っているすべての従業員を取得するために抱き合わせています"Design"とタイプ "Testing"のNoneアクティビティを入力します。

私は動作するクエリがありますが、私はそれをジョインで動作させたいと思います。

これは動作します:

SELECT c.name FROM `employee_activities` a, `activity` b, `employees` c 
WHERE a.activity_code = b.code 
AND a.employee_code = c.code 
AND b.type = "Design" 

AND c.code NOT IN(
    SELECT c.code FROM `employee_activities` a, `activity` b, `employees` c 
     WHERE a.activity_code = b.code 
     AND a.employee_code = c.code 
     AND b.type = "Testing" 
) 
GROUP BY c.code 

私が参加すると、SQLに間違って何をしたのですか?

+2

サブクエリのように 'SELECT *'を実行することはできません。 'c.code NOT IN'部分は返される単一のcloumnを探しています。 – LittleBobbyTables

+0

ありがとうございます。皆さん、ありがとうございました。 :) –

+0

これは解決されたようですが、まだsqlfiddleで質問を更新することを検討している場合は、解決します。 – Strawberry

答えて

7

のためではないサブクエリで - それは1つの列のみが含まれている必要があり - 例えば

SELECT * FROM `employee_activities` a 
LEFT JOIN `activity` b ON a.activity_code = b.code 
LEFT JOIN `employees` c ON a.employee_code = c.code 
WHERE b.type = "Design" 
AND c.code NOT IN(
    SELECT b.employee_code FROM `employee_activities` a 
     LEFT JOIN `activity` b ON a.activity_code = b.code 
     LEFT JOIN `employees` c ON a.employee_code = c.code 
     WHERE b.type = "Testing" 
) 
GROUP BY c.code 
+0

ooops。ええ、私の悪い。それを見ていない。ありがとう。 –

2

あなたの問題は、この部分にある:

AND c.code NOT IN(
SELECT * FROM 

あなたはここのように*を持つことができませんc.codeが返されたフィールド値のリストに含まれているかどうかを調べ、selectに単一のフィールドを指定する必要があります。

2

問題は、このセクションにあります:あなたはそのネストされたクエリでSELECT *することはできません

AND c.code NOT IN( 
    SELECT * FROM `employee_activities` a 

c.codeと比較される列を1つだけ選択する必要があります。あなたは代わりに、これを必要とする:

AND c.code NOT IN( 
    SELECT c.code FROM `employee_activities` a 
3

あなたのクエリ

AND c.code NOT IN(
    SELECT * FROM `employee_activities` a 
... 

はサブクエリににすべての列をc.codeを比較しようとします。おそらくあなたが望むのは、

AND c.code NOT IN(
    SELECT c.code FROM `employee_activities` a 

また、LEFT JOINに問題があります。あなたはWHERE句にで参加したままにされている列を比較すると、それは基本的に全体を回す

LEFT JOIN `activity` b ON a.activity_code = b.code 
... 
WHERE b.type = "Design" 

INNER JOINに参加します。元のクエリが内部結合を使用しているようだから、それは問題ありませんが、変更することもできます。

SELECT * FROM `employee_activities` a 
JOIN `activity` b ON a.activity_code = b.code AND b.type='Design' 
LEFT JOIN `employees` c ON a.employee_code = c.code 
2

このDO:として、ここでは、コード列でデータを比較すべきであり、*すべてのレコードをフェッチします

SELECT * FROM `employee_activities` a 
LEFT JOIN `activity` b ON a.activity_code = b.code 
LEFT JOIN `employees` c ON a.employee_code = c.code 
WHERE b.type = "Design" 
AND c.code NOT IN(
    SELECT c.code FROM `employee_activities` a 
     LEFT JOIN `activity` b ON a.activity_code = b.code 
     LEFT JOIN `employees` c ON a.employee_code = c.code 
     WHERE b.type = "Testing" 
) 
GROUP BY c.code 

を。

関連する問題