2

テーブルは5つ

  1. ユーザーの個人データ (users _ record=120000)。
  2. 働いているユーザー (users_positions _ record=150000)。
  3. 組織 (組織 _ レコード = 2500)。
  4. 部門 (部門 _ レコード = 3500)。
  5. ポジション (positions _ record=4500)。

これらのテーブルを結合したいのですが、最適なクエリは何ですか?

私はこのクエリを書きますが、非常に遅いです:

SELECT 
  * 
FROM
  (SELECT 
    p.* 
  FROM
    `user_positions` p 
    LEFT JOIN `organizations` u_o 
      ON u_o.`id` = p.`org_title` 
    LEFT JOIN `divisions` u_d 
      ON u_d.`id` = p.`division` 
    LEFT JOIN `positions` u_p 
      ON u_p.`id` = p.`position` 
      WHERE u_o.`status` = 1 
  GROUP BY p.`PRN`) u_a 
  LEFT JOIN `users` u 
    ON u.`PRN` = u_a.`PRN` 

例 - 単純構造

table users
-- PRN --- FirstName --- Age....
-- 001 --- david --- 24 ....
-- 052 --- george --- 27 ....


table users_positions
-- PRN --- Organization_ID --- Division_ID --- Positionn_ID....
-- 001 --- 1 --- 5 --- 1....
-- 001 --- 2 --- 10 --- 5....
-- 052 --- 1 --- 1 --- 1....

table organizations
-- ID --- Name ....
-- 1 --- test 1 ....
-- 2 --- test 2 ....

table divisions
-- ID --- Name --- Age....
-- 1 --- IT Department ....
-- 5 --- Sale Department ....
-- 10 --- Administration Department ....

table positions
-- ID --- Name --- Age....
-- 1 --- Programmer ....
-- 5 --- Manager ....
4

1 に答える 1

3

GROUP BYクエリでを使用している理由がわかりません。AGROUP BYは通常、クエリに集計関数がある場合に使用されます。しかし、私はあなたが以下を使うことができるかもしれないと言うでしょう:

select *
from users u
left join users_positions up
  on u.PRN = up.PRN
left join positions p
  on up.id = p.position
left join organizations o
  on p.org_title = o.id
left join divisions d
  on p.division = d.id

提供したサンプルデータを使用して編集します。使用できるクエリのサンプルは次のとおりです。

select u.prn,
  u.firstname,
  u.age,
  o.name orgName,
  p.name positionName,
  d.name divisionName
from users u
left join users_positions up
  on u.PRN = up.PRN
left join organizations o
  on up.Organization_ID = o.id
left join positions p
  on up.Positionn_ID = p.id
left join divisions d
  on up.Division_ID = d.id

SQL FiddlewithDemoを参照してください

このクエリの結果は次のとおりです。

| PRN | FIRSTNAME | AGE | ORGNAME | POSITIONNAME |              DIVISIONNAME |
------------------------------------------------------------------------------
| 001 |     david |  24 |  test 1 |   Programmer |           Sale Department |
| 001 |     david |  24 |  test 2 |      Manager | Administration Department |
| 052 |    george |  27 |  test 1 |   Programmer |             IT Department |

ユーザーごとに1つの組織などのみを返す場合は、返す正しい結果をどのように決定するかを決定する必要があります。たとえば、max(Organization_ID)ユーザーごとにのみ返したい場合は、次のようなものを使用できます。

select u.prn,
  u.firstname,
  u.age,
  o.name orgName,
  p.name positionName,
  d.name divisionName
from users u
left join
(
  select max(Organization_ID) Organization_ID, PRN
  from users_positions
  group by PRN
) up1
  on u.PRN = up1.PRN
left join users_positions up2
  on up1.PRN = up2.prn
  and up1.Organization_ID = up2.Organization_ID
left join organizations o
  on up2.Organization_ID = o.id
left join positions p
  on up2.Positionn_ID = p.id
left join divisions d
  on up2.Division_ID = d.id

SQL FiddlewithDemoを参照してください

結果:

| PRN | FIRSTNAME | AGE | ORGNAME | POSITIONNAME |              DIVISIONNAME |
------------------------------------------------------------------------------
| 001 |     david |  24 |  test 2 |      Manager | Administration Department |
| 052 |    george |  27 |  test 1 |   Programmer |             IT Department |
于 2012-11-27T11:45:23.303 に答える