1

私は通常join、このアプローチを使用しますが、この場合は少し混乱しています。それが可能かどうかさえ、私にはまったくわかりません。使用され left joinている複数の代わりに、次のクエリをクエリに変換できるかどうか疑問に思います。select in

select 
   users.id, users.first_name, users.last_name, users.description, users.email 
from users 
where id in (
     select assigned.id_user from assigned where id_project in (
            select assigned.id_project from assigned where id_user = 1
                                                               )
            ) 
   or id in (
     select projects.id_user from projects where projects.id in (
            select assigned.id_project from assigned where id_user = 1
                                                                )
            )  

このクエリは正しい結果セットを返します。assigned.id_projectただ、選択するクエリの繰り返しはもったいないと思います。

4

3 に答える 3

4

ユーザー 1 のプロジェクト割り当てから始めることができますa1。次に、それらのプロジェクトに対する他の人々のすべての割り当てとa2、プロジェクト テーブル内のユーザーを見つけますp。探しているユーザーは、 または のいずれa2かにいpます。両方の方法で到達できるユーザーを削除するために、distinct を追加しました。

select  distinct u.*
from    assigned a1
left join    
        assigned a2
on      a1.id_project = a2.id_project
left join
        project p
on      a1.id_project = p.id
join    user u
on      u.id = a2.id_user
        or u.id = p.id_user
where   a1.id_user = 1
于 2012-10-27T10:29:42.603 に答える
3

両方のサブクエリには、assigned.id_user = 1 という条件があるため、そのクエリから始めます。その割り当てを「主要な割り当て」と呼びましょう。

次に、「オプション」テーブルの左結合を使用して、残りを結合します。user主要な割り当てにリンクされた割り当てのユーザーまたは主要なプロジェクトにリンクされたプロジェクトのユーザーのいずれかに一致する内部結合を使用します。

各ユーザーが割り当てとプロジェクト (または複数のプロジェクト) を持っている場合は、各ユーザーに 1 回のイベントが必要であると想定しているため、個別を使用します。

select distinct
  u.id, u.first_name, u.last_name, u.description, u.email 
from 
  assigned a
  left join assigned ap on ap.id_project = a.id_project
  left join projects p on p.id = a.id_project
  inner join users u on u.id = ap.id_user or u.id = p.id_user
where
  a.id_user = 1
于 2012-10-27T10:21:14.533 に答える
2

繰り返しを取り除く別の方法を次に示します。

SELECT
  users.id,
  users.first_name,
  users.last_name,
  users.description,
  users.email 
FROM users
WHERE id IN (
  SELECT up.id_user
  FROM (
    SELECT id_user, id_project FROM assigned
    UNION ALL
    SELECT id_user, id         FROM projects
  ) up
  INNER JOIN assigned a
    ON a.id_project = up.id_project
  WHERE a.id_user = 1
)
;

つまり、assignedテーブルの のペアは のペアとid_user, id_projectUNION されprojectsます。次に、結果セットがプロジェクトと結合され、user_id = 1プロジェクトを ID 1 ユーザーと共有するすべてのユーザーのリストが取得されます。あとは、これらのユーザーの詳細を取得するだけです。この場合は、クエリと同じ方法で、つまり IN 句を使用して行われます。

申し訳ありませんが、このクエリのパフォーマンスを徹底的にテストするための MySQL を持っていないため、元のクエリよりも優れているか悪いか、または@GolezTrol@Andomarによる。一般的に、単純な(半または何でも)結合と反復部分を含むクエリは、反復のない同等の洗練されたクエリよりも効率的であるという@GolezTrolのコメントに同意する傾向があります。ただし、最終的には、最終的な答えを明らかにしなければならないのはテストです。

于 2012-10-27T13:09:08.803 に答える