1

私はいくつかのテーブルを持っています:

lecturer(id,name,email)
- 1,john,john@abc.com
- 2,andy,andy@abc.com
- 3,kyle,kyle@abc.com
- 4,allen,allen@abc.com

sig(id,name)
- s1, Multimedia
- s2, Business IT

expertise(id, description); 
- e1, Gaming
- e2, Graphic
- e3, Multimedia System
- e4, E-Business

lecturer_has_expertise(lecturer.id,expertise.id)
- 1, e1
- 2, e2
- 3, e4
- 4, e1

lecturer_has_sig (lecturer.id,sig.id)
- 1, s1
- 2, s1
- 3, s2

sig_has_expertise(sig.id,expertise.id)
- s1, e1
- s1, e2
- s1, e3
- s2, e4

表示したい出力は次のとおりです。

Lecturer's Name, Email, Expertise

基本的には、ユーザーがテキストボックスに例: Gamingというキーワードを入力すると、どの講師の専門知識がゲームであるかが表示され、Gaming はMultimediaの下にあるため、Multimedia の sig内のすべての講師に関するデータも表示されます。例えば:

Name   Email            Expertise
John   john@abc.com     Gaming
Allen  allen@abc.com    Gaming
Andy   andy@abc.com     Graphic    

ユーザーが入力した専門知識のみを出力することができましたが、同じ sig のすべての専門知識を出力することはできませんでした。

前もって感謝します

4

2 に答える 2

1

これは (少なくともサンプルでは) 動作し、MySQL でテストされています。しかし、これは単純な SQL であるため、ほとんどのデータベースで動作するはずです。

SELECT lc.name, lc.email, ex.description
FROM lecturer lc 
INNER JOIN lecturer_has_expertise lhc ON lc.id = lhc.lcId
INNER JOIN expertise ex ON ex.id = lhc.exId
WHERE ex.description = 'Gaming'

UNION

SELECT lc.name, lc.email, ex2.description
FROM 
(SELECT she.sigId FROM expertise ex 
INNER JOIN sig_has_expertise she ON she.exId = ex.id
WHERE ex.description = 'Gaming') sigex
INNER JOIN sig_has_expertise she2 ON sigex.sigId = she2.sigId
INNER JOIN expertise ex2 ON she2.exId = ex2.id
INNER JOIN lecturer_has_expertise lhc ON ex2.id = lhc.exId
INNER JOIN lecturer lc ON lhc.lcId = lc.id

次回は、サンプル データの DDL を提供してください (少なくともこのような複雑なクエリの場合)。

于 2012-05-29T19:39:33.370 に答える
1

したがって、基本的には、次のいずれかのすべての教師を返す必要があります。

  • 特定の専門知識を持っている

    また

  • 特定の専門知識を持つグループに属しています。

上記を SQL に変換すると、次のようになります。

SELECT
  l.name,
  l.email,
  e.description AS expertise
FROM lecturer_has_expertise le
  INNER JOIN lecturer l ON l.id = le.lecturer_id
  INNER JOIN expertise e ON e.id = le.expertise_id
WHERE e.description = @InputExpertise
   OR EXISTS (
     SELECT *
     FROM lecturer_has_sig ls
       INNER JOIN sig_has_expertise se ON ls.sig_id = se.sig_id
       INNER JOIN expertise e ON e.id = se.expertise_id
     WHERE e.description = @InputExpertise
       AND ls.lecturer_id = le.lecturer_id
   )
于 2012-05-29T19:44:43.323 に答える