0

内部結合を使用して 3 つのテーブルからレコードを取得するクエリが 1 つあります。

table name

tbl_emp as emp
tbl_sal as sal
tbl_address as addr

fields from 3 tables

Schema:

tbl_emp - empid,name,comp_id
tbl_sal - empid - emp_type
tbl_address - emp_type

クエリ

SELECT emp.empid, emp.name, sal.salary, addr.address 
from tbl_emp as emp 
INNER JOIN tbl_sal as sal 
  ON emp.empid = sal.empid 
INNER JOIN tbl_address as addr 
  ON addr.emp_type = sal.emp_type 
where comp_id = '114';

結果は次のとおりです。

1 abc 1000 test
1 abc 1000 test
1 abc 1000 test
1 abc 1000 test
1 abc 1000 test
2 xyz 2500 main
2 xyz 2500 main
2 xyz 2500 main
2 xyz 2500 main
2 xyz 2500 main

私は次のような結果が欲しい:

1 abc 1000 test
2 xyz 2500 main

これについて私を助けてください。

4

5 に答える 5

2

サンプル データに基づいて、以下を使用できるはずですDISTINCT

SELECT DISTINCT emp.empid, 
  emp.name,
  sal.salary,
  addr.address 
from tbl_emp as emp 
INNER JOIN tbl_sal as sal 
  ON emp.empid = sal.empid 
INNER JOIN tbl_address as addr 
  ON addr.emp_type = sal.emp_type 
where comp_id = '114';

DISTINCTデータのすべての列に適用され、重複があれば削除されます。限られたサンプルでこれを適用できます。

を使用して結果を取得することもできますGROUP BY。を適用する場合の私の提案は、リストGROUP BY内のすべてのアイテムに適用することです。SELECT

SELECT emp.empid, 
  emp.name,
  sal.salary,
  addr.address 
from tbl_emp as emp 
INNER JOIN tbl_sal as sal 
  ON emp.empid = sal.empid 
INNER JOIN tbl_address as addr 
  ON addr.emp_type = sal.emp_type 
where comp_id = '114'
GROUP BY emp.empid, emp.name, sal.salary, addr.address;

GROUP BYMySQL は、選択リスト内の項目を集約せず、GROUP BY句に含めないようにする拡張機能を使用します。ただし、MySQL は返される値を選択できるため、予期しない結果が生じる可能性があります。( GROUP BY に対する MySQL 拡張機能を参照してください)

MySQL ドキュメントから:

MySQL は GROUP BY の使用を拡張して、選択リストが GROUP BY 句で指定されていない非集計列を参照できるようにします。... この機能を使用して、不要な列の並べ替えやグループ化を回避することで、パフォーマンスを向上させることができます。ただし、これは主に、GROUP BY で指定されていない各非集計列のすべての値が各グループで同じ場合に役立ちます。サーバーは各グループから任意の値を自由に選択できるため、それらが同じでない限り、選択された値は不確定です。さらに、各グループからの値の選択は、ORDER BY 句を追加しても影響を受けません。結果セットのソートは値が選択された後に行われ、ORDER BY はサーバーが選択する値には影響しません。

于 2013-03-04T09:54:37.783 に答える
1

グループ化を使用:

SELECT emp.empid,emp.name,sal.salary,addr.address from tbl_emp as emp INNER JOIN tbl_sal as sal ON emp.empid = sal.empid INNER JOIN tbl_address as addr ON addr.emp_type = sal.emp_type where comp_id = '114'
group by emp.empid,emp.name,sal.salary,addr.address
于 2013-03-04T09:53:34.023 に答える
1

これを試して

SELECT  emp.empid,
        emp.name,
        sal.salary,
        addr.address 
FROM tbl_emp as emp 
INNER JOIN tbl_sal as sal 
    ON emp.empid = sal.empid 
INNER JOIN tbl_address as addr 
    ON addr.emp_type = sal.emp_type 
WHERE comp_id = '114'  
GROUP BY empid;
于 2013-03-04T09:53:51.527 に答える
0

DISTINCT キーワードはあなたが望むことを行い、重複が確実に除外されるようにします

SELECT DISTINCT emp.empid,emp.name,sal.salary,addr.address from tbl_emp as emp INNER JOIN tbl_sal as sal ON emp.empid = sal.empid INNER JOIN tbl_address as addr ON addr.emp_type = sal.emp_type where comp_id = '114';

ただし、重複が発生する場合は、クエリが実際に想定どおりに動作することを確認する必要があります。そうしないと、(クエリによって作成されたものではなく) 結果セットに本物の重複がある場合、DISTINCT の使用に問題が発生する可能性があります。

于 2013-03-04T09:55:03.090 に答える
0

試すgroup by emp.empid

SELECT emp.empid,emp.name,sal.salary,addr.address from tbl_emp as emp INNER JOIN tbl_sal as sal ON emp.empid = sal.empid INNER JOIN tbl_address as addr ON addr.emp_type = sal.emp_type where comp_id = '114'  group by emp.empid ;
于 2013-03-04T09:56:10.420 に答える