2017-03-22 17 views
0

これは純粋に効率的な質問です。IN句で使用するために3つの別個の列を1つにまとめる

id  | name   | email 
-------+----------------+--------------------- 
12  | Bob   | [email protected] 
15  | Dave   | [email protected] 

これを実行することが可能です:ユーザーIDがエンティティ内でのそれらの位置

id  | supervisor  | manager  | worker 
-------+----------------+--------------+--------------- 
1  | 12    | 15   | 32 
2  | 12    | 42   | 22 

に基づいて保存され、ユーザー情報とのいずれかがされている

一つ:私は2つのテーブルを持っています3の代わりにIN句を1つだけ使用しますか?

SELECT `name`, `email` 
FROM `tbl_users` 
WHERE `id` IN 
(SELECT `supervisor` FROM `tbl_warehouse` WHERE `id` = 'WAREHOUSEID') 
OR `id` IN 
(SELECT `manager` FROM `tbl_warehouse` WHERE `id` = 'WAREHOUSEID') 
OR `id` IN 
(SELECT `worker` FROM `tbl_warehouse` WHERE `id` = 'WAREHOUSEID') 

私はあなたがEXISTSを使用して、サブクエリ内INを使用することができますIN句が働くように、1列にsupervisormanagerworker列を結合しようとしているいくつかのことを試みたが、成功

+0

' 'WAREHOUSEID''はあなたより良い、パラメータの場合この '@ warehouseid'のように、文字列と数字を混在させているように見えます。 –

+0

例として、これに' WAREHOUSEID'を投げただけです。それは私が用意したステートメントで設定したパラメータです – eeetee

+0

私は知っている、次回のヒントです。また、あなたの質問では、2つのテーブルを表示するが、もちろん、あなたが推測することができるクエリのように見える名前を言うことはありません。しかし、あなたが最初から明確にした方が良いです。 –

答えて

1

ずにそうしました:

select `name`, 
    `email` 
from `tbl_users` u 
where exists (
     select 1 
     from `tbl_warehouse` w 
     where w.id = 'WAREHOUSEID' 
      and u.id in (w.supervisor, w.manager, w.worker) 
     ) 

あなたもJOINを使ってこれを実現:

select u.name, u.email 
from tbl_users u 
join tbl_warehouse w on u.id in (w.supervisor, w.manager, w.worker) 
where w.id = 'WAREHOUSEID' 
+0

'EXISTS'は素晴らしく機能しました。本当に役に立つものを学びました。ありがとう! – eeetee

0

か、また:

SELECT 
    name 
, email 
FROM tbl_users u 
JOIN (
      SELECT supervisor FROM tbl_warehouse WHERE id = 'WAREHOUSEID' 
UNION ALL SELECT manager FROM tbl_warehouse WHERE id = 'WAREHOUSEID' 
UNION ALL SELECT worker  FROM tbl_warehouse WHERE id = 'WAREHOUSEID' 
) w(id) 
USING(id); 

、すでにあなたは整数と整数に参加することを、他の場所で言ったように、確認してください...

関連する問題