2017-10-08 17 views
3

これは本当にシンプルなはずですが、私はそれに固執してここで答えを見つけることができませんでした。IDが別のテーブルに存在する場合、MYSQL select count(*)が1つのテーブルにあります

user_idに一致するレコードの数を1つのテーブルに数えたい場合は、user_idが別のテーブルに存在する場合、または-1以外の場合は-1を返します。以下のような

何か:要するに

SELECT COUNT(*) 
FROM table_1 
WHERE user_id = (IF EXISTS table_2.user_id = '22') 
, ELSE -1; 

、22のuser_id含まtable_2場合は、その後、22のuser_idtable_1のレコード数を返すか、いない場合は、-1を返します。

どうすればよろしいですか?追加テーブルのサンプル:

table_1 
--------------------- 
user_id | item 
--------------------- 
22  | apple 
23  | orange 
22  | banana 

table_2 
--------------------- 
user_id | name 
--------------------- 
20  | billy 
21  | bob 
22  | thornton 

だから、私は 0を返します user_id = 21で必要なクエリを実行して実行している

EDIT(NBちょうどuser_idは、どちらかのテーブルの主キーではなく、明確にするために) user_id = 222を返し、user_id = 23-1を返します。

+0

サンプルデータと希望の結果を提供できますか?あなたの要求は私には意味がありません。あなたは 'where'で比較して、何かが' -1'を返すと言っています。 –

答えて

1

あなたが使用できるちょっとしたトリックは、両方のテーブルからカウントを選択し、結果をクロス結合することです。あなたがいないgroup by句で集約関数を照会しているので、あなたは、それぞれの結果に1行を取得することを保証している:

SELECT  CASE cnt_2 WHEN 0 THEN -1 ELSE cnt_1 END 
FROM  (SELECT COUNT(*) AS cnt_1 
      FROM table_1 
      WHERE user_id = 22) t 
CROSS JOIN (SELECT COUNT(*) AS cnt_2 
      FROM table_2 
      WHERE user_id = 22) s 
+0

JOINはペナルティです。 –

+0

これはちょっと過度に複雑に見えますが、おそらく高価で2つのカウントと結合をしていますか?私はtable_2のマッチの数を数える必要はなく、少なくとも1つのマッチがあるかどうかを知る必要があります。 – freeworlder

+0

MySqlはエラーを返します:#1248 - すべての派生テーブルには独自のエイリアスが必要です – freeworlder

1

が、これはあなたが必要結果が得られていますか?

SELECT 
CASE COUNT(*) WHEN 0 THEN -1 ELSE COUNT(*) END AS row_count 
FROM table_1 
WHERE user_id = 22 
AND (
    SELECT COUNT(*) 
    FROM table_2 
    WHERE user_id = 22) >= 1; 

CASE文を使用してチェックを実装し、レコードが見つからない場合は-1を表示します。 WHERE句のサブクエリを使用してtable_2のレコード数を調べ、それが1以上であることを確認します。

これを行うにはいくつかの方法があります。 LEFT JOINやEXISTSのようなものですが、これはうまくいくと思います。

+0

私はこれを動作させることができませんでした。文法エラーがたくさんあります。予期しないキーワード。 (位置12の「COUNT」の近く) CASE式の予期しない終了(位置11の「 "」近く) キーワードが認識されません。 (位置12の "COUNT"近く) 予期しないトークン。 (位置 "17"の近く) 予期しないトークン(位置18の "*"の近く) 予期しないトークン(位置 "の近く)" キーワードが認識されません。 (21桁目の "WHEN"の近く) 予期しないトークン。 (26桁目の「0」付近) キーワードが認識されません。 (28桁目の「THEN」付近) 予期しないトークン。(33位の "-1"の近く)...? – freeworlder

+0

SELECT COUNT(*)とCASEが有効な構文を使用している理由がわかりません。私はチャンスを得ると、MySQLのデータベースに対してそれをチェックします。 – bbrumm

+0

私は構文をチェックし、それは正常に見えます。あなたは余分な引用符を持っていますか、これに何か変更を加えましたか? – bbrumm

関連する問題