2011-06-23 6 views
0

次のクエリは、すべての店の取締役を検索します。私はこれにはもっと簡単な解決策があると思います。私が使用することを好むものです。ありがとうございました。このMySQLクエリではより良いアプローチがありますか?

SELECT s.ShopID, (EmployeeName+' '+EmployeeSurname) AS FullName FROM shop AS s 
JOIN WorksOn AS w ON s.ShopID = w.ShopID 
JOIN employee AS e ON w.EmployeeID = e.EmployeeID 
JOIN director AS d ON e.EmployeeID = d.EmployeeID 

TABLES

employee : EmployeeID, EmployeeName,EmployeeSurname 
shop: ShopID, Name, Address 
WorksOn: EmployeeID, ShopID 
director: EmployeeID 
+0

よく見えますが、取得されたデータは実際には意味がありません。すべてのお店を表示しますか?またはすべての店舗+すべてのエンパイヤー?なぜあなたはディレクターのテーブルに参加しますか? – user194076

+1

@ user194076彼はディレクターのフィルターとしてdirectorテーブルを結合します。 – Karolis

+0

それは、店のIDとディレクターである従業員の氏名を表示します。私が正しい結果を得たとしても、これを行うより良い方法があると私は思っています。はい、Karolisのように – EnexoOnoma

答えて

1

これは非常に単純なクエリです。あなたが提供した情報によると、私はもっと単純なものは見ません。

Pardon。はい、2つの結合でそれを行うことができます:

SELECT 
    w.ShopID, (EmployeeName+' '+EmployeeSurname) AS FullName 
FROM 
    WorksOn AS w 
    JOIN employee AS e ON w.EmployeeID = e.EmployeeID 
    JOIN director AS d ON e.EmployeeID = d.EmployeeID 
+0

私はそれが2つの結合だけで解決策を持たなければならないと思います。これは私がやろうとしていることです – EnexoOnoma

+1

2つの結合を行う唯一の方法 - 従業員の列にビット列 "IsDirector"を配置します。 – user194076

+0

@Sampas Yeah。 @ user194076が正しいです。何か簡単にしたい場合は、データベースの構造を変更する必要があります。 – Karolis

1

これは、このクエリのいくつかの実用上の問題です。あなたがそれをどのように使用しているかに応じて問題になることはありません。しかし、私はあなたの場合、満足していないと思っています。だからここに私の問題があります:

  1. 店舗のディレクターなどがいない場合は、その店舗の結果は得られません。 LEFT JOINを押してください。
  2. 取締役が2名、従業員が2名の場合、4つのレコードが得られます。したがって、別のクエリを使用するか、GROUP BYおよびGROUP_CONCATまたは他の集計関数を使用して修正することができます。
+0

GROUP BYとGROUP_CONCATを使用してどのように変更されますか?それは個人的な使用のための質問ではなく、何か重要なものではありませんが、私はそれを最高の状態で実行しようとしています。 – EnexoOnoma

+0

Shopでグループ化すると、そのショップのレコードは1つしかなく、group_concat(employee_id)、group_concat(director_id)、そしてすべてのデータを1つのレコードにまとめることができます。 200人の従業員を持つ大規模な店舗と、20人の取締役にGROUP BYのない4000件のレコードまたは別々のクエリがある場合は、 –

関連する問題