3つのテーブルがあります
・社員テーブル (T_USER)
1,鈴木
2,佐藤
3,斉藤
4,佐々木
5,山本
・スキルテーブル (T_SKILL)
1,英語
2,中国語
3,韓国語
4,プログラミング
5,設計
6,インフラ
7,ネットワーク
8,マーケティング
9,SEO
・社員スキルテーブル (T_USER_SKILL)
社員スキルID, 社員ID, スキルID
1,1,1
2,1,2
3,1,4
4,2,1
5,2,6
6,3,4
6,3,5
6,3,6
・
・
・
このようなとき、英語もしくは中国語ができる人を探すのは以下のようなSQLで出来ることがわかりました
select B.name from (select user_id from T_USER_SKILL where skill_id in (1,2)) A left join T_USER B on A.user_id = B.user_id;
英語と中国語、両方出来る人を探すにはどのように書いたら良いのでしょうか。
よろしくお願いします。
select B.name from (
select distinct A1.user_id1 user_id from
(select A1.user_id user_id1,A1.skill_id from T_USER_SKILL A1 Where A1.skill_id = 1) A1 inner join
(select A2.user_id user_id4,A2.skill_id from T_USER_SKILL A2 Where A2.skill_id = 2) A4
on A1.user_id1 = A4.user_id4
) A left join T_USER B on A.user_id = B.user_id
こんな感じでいいでしょう。
No2の回答の最初のSQLでは、社員が 3つ以上のスキルを持っている場合、
つまり 英語と中国語とそれ以外のスキルを 持っている人は 抽出されません。
あと No2の回答の二番目のSQLは 同じ人が 複数抽出されてしまいます。
>最初のSQLでは、社員が 3つ以上のスキルを持っている場合、
>つまり 英語と中国語とそれ以外のスキルを 持っている人は 抽出されません。
WHERE skill_id in (1, 2) にて英語と中国語だけに条件を絞ってあるので、
他のスキルの有無は関係なく英語と中国語を両方話せる人を抽出できます。
>きゃづみぃ 2013/03/25 18:52:15
>No2の回答の二番目のSQLは 同じ人が 複数抽出されてしまいます
これはそのとおりです。
WHEREの次に GROUP BY A1.user_id を入れれば一人一レコードにできますので、必要であれば追加してください。
>一番目と二番目の結果が 違う
サンプルデータと実行したSQLと結果をどうぞ。
ま、私が 回答したものを使ってもらえればいいので それは それとして質問者さんには
参考にしてもらえればいいと思います。
私は誠実に WHERE skill_id in (1, 2) にて制限してあると回答していますが、
それに対してのコメントがまったくありませんので、今も誤解したままでおられる可能性が高く、
回答ならびにコメントした立場として、誠実に対応してください。
>私が 回答したものを使ってもらえればいいの
GROUP BY や HAVING などのSQLの基礎を理解していれば簡単に済むものを、
SELECTを何重にもする必要のない場面であのような応用性のないものを選らんで使ってもらうとすれば残念です。
誠実な対応を行わないならばガイドラインの注意事項違反です。
ぜひとも誠実な対応をよろしくどうぞ。
まずは、サンプルデータと実行したSQLと結果をよろしくどうぞ。
それと、WHERE skill_id in (1, 2)についての申し開きか謝罪もあわせてよろしく。
http://q.hatena.ne.jp/help/guideline
>>
本サービスに投稿した質問や回答、コメントに対して、反論、指摘や追加情報を求める内容が投稿される場合がありますが、ご自身の責任において誠実に対応を行ってください
<<
別に そういうふうに とらえるんなら それでいいですということです。
ただ二番目のSQLには
WHERE skill_id in (1, 2)
は 使ってないですよね?
ということは
WHERE skill_id in (1, 2) にて制限してある
のとは 違うということです。
ちなみに 実行したSQLと言ってますが、 №2の回答にあるSQLで 何も修正してませんけど。
どのようなテストをしたらいいのか 想像できないようでしたら コメントしてください。
>ただ二番目のSQLには
>WHERE skill_id in (1, 2)
>は 使ってないですよね?
何が「ただ」ですか?
二番目のほうはJOINを用いて横に並べる形になっているので、
下記のようにな形でフィルタをかけてます。
WHERE A1.skill_id = 1 AND A2.skill_id = 2
あなたが指摘したのは一番目のほうです。
話をはぐらかそうとしないで誠実に対応してください。
>きゃづみぃ 2013/03/25 19:38:24
>ちなみに 実行したSQLと言ってますが、 №2の回答にあるSQLで 何も修正してませんけど。
何も修正していないならデータのほうにミスがあるのでしょうとしか言えませんが、
どうせあなたは「質問文通りです」と答えるつもりでしょうね。
仮に質問文通りだとして、では具体的にそれぞれどのような結果になったのですか?
結果を書くだけでよいのに、なぜ書かないのですか? いいわけを考えてませんか?
繰り返します。誠実に対応してください。
誠実な対応を期待します。
二番目のSQLは 英語と中国語の両方のみと、英語と中国語とそれ以外にもできる人も抽出されています。
このような結果の食い違いから
私が指摘したことによる返答
>>最初のSQLでは、社員が 3つ以上のスキルを持っている場合、
>>つまり 英語と中国語とそれ以外のスキルを 持っている人は 抽出されません。
>WHERE skill_id in (1, 2) にて英語と中国語だけに条件を絞ってあるので、
>他のスキルの有無は関係なく英語と中国語を両方話せる人を抽出できます。
により、ぜんぜん理解されてないということが わかりました。
もちろん質問者が必要とする回答は、私が既にしていますので
わざわざ修正していただく必要は ない ということです。
ただ、質問者の方には、そのような違いがあるということだけは 理解してもらいたかっただけです。
>一番目のSQLは 英語と中国語が両方出来る人のみでしたが
>二番目のSQLは 英語と中国語の両方のみと、英語と中国語とそれ以外にもできる人も抽出されています。
英語と中国語の両方使える人を抽出するという点でどちらも同じですから、
質問者さんが求めている結果は出してますが、それが何か問題でも?
出来る限り基本に忠実に簡単な構文にしての2例で、
それぞれ理解した上で使い分けてもらえば良いだけですが、それが何か問題でも?
ところで、長々とやってきた結果が「コレだけ」ですか?
これだけのことをどうして最初の一回に書かなかったのですか?
次回があれば、もっと誠実にわかりやすいようにコメントするようにしていただきたいです。
>英語と中国語の両方使える人を抽出するという点でどちらも同じですから、
>質問者さんが求めている結果は出してますが、それが何か問題でも?
一番目のSQLだと ほかのスキルがある人は抽出されません。
これは 問題じゃないと 言い切るなら 私は何もいいませんが。
WHERE skill_id in (1, 2) で英語あるいは中国語のスキルを持っているデータだけに絞り、
さらに count(*)=2 で両方もった人に限定するという二段で処理しています。
このことは、一番最初の私のコメントで下記のように説明したはずです。
「WHERE skill_id in (1, 2) にて英語と中国語だけに条件を絞ってある」
GROUP BY と HAVING count(*) = ほげほげ という書き方はSQLの基礎ですから、
何度も同じことを書かないでください。
きゃづみぃ 2013/03/25 21:20:35>私は何もいいませんが
あなたがSQLを理解できないことは重々わかりましたが、
あなたの書いたコメントに対しての訂正と謝罪は要求させていてだきます。
訂正ならびに謝罪を行わないのであれば、ガイドラインの注意事項違反として、
これまでの言動も踏まえて厳正に対処させていただきます。
訂正ならびに謝罪はこの質問の自動終了日時までは待つこととします。
ゆっくりと吟味して、言葉を選んで、誠実な対応をなさることを期待します。
誠意が見られない場合は、即座に対応させていただく所存ですから、よろしくどうぞ。
なお、
私の回答をなんとか捻じ曲げようと努力するだけの きゃづみぃ(id:taknt) とのやりとりは無駄なだけなので、
ここでの、きゃづみぃ(id:taknt) からの問いかけに対しては答えないようにします。
こちらが求めるのは訂正と謝罪のみです。