次のようなテーブルがあります。
Table1(Contract_id, name, address, contact_no)
そして、次のような別のテーブル、
Table2(Contract_id, approver, owner, authority)
サンプルデータ:
mysql> select * from Table1;
+-------------+-------+---------+------------+
| contract_id | owner | address | contact_no |
+-------------+-------+---------+------------+
| 11111 | XXX | Madurai | 897161 |
| 12456 | XYZ | Madras | 897161 |
| 11111 | XYZ | Madras | 897161 |
+-------------+-------+---------+------------+
3 rows in set (0.00 sec)
mysql> select * from Table2;
+-------------+----------+
| contract_id | approver |
+-------------+----------+
| 11111 | YZX |
| 11112 | YYY |
+-------------+----------+
2 rows in set (0.00 sec)
すべての contract_ids と一致するデータをこのような条件で取得するクエリを作成しました。
「所有者が「X」、住所が「マッド」、承認者が「YZX」のすべての契約を取得する」
select contract_id,owner,address,approver
from
(
select *
from Table1
where owner like '%X%'
and address like '%Mad%'
) t1
inner join
(
select *
from Table2
where approver = 'YZX'
) t2 using (contract_id);
結果を正しく返しています。しかし問題は、左のテーブルには一致する行が 2 つあり、右のテーブルには一致する行が 1 つしかないことです。したがって、右の表の行は 2 回複製されます。
> +-------------+---------------+-----------+-------------+
> |contract_id | owner | address | approver |
> +-------------+---------------+-----------+-------------+
> |11111 | XXX | Madurai | YZX |
> +-------------+---------------+-----------+-------------+
> |11111 | XYZ | Madras | YZX |
> +-------------+---------------+-----------+-------------+
承認者の値が 2 回重複しています。どうにかしてこのmysql自体を回避できますか? 2 行目の承認者列に null 値が必要です。
編集1:
最後に承認者ごとにグループ化するようにクエリを編集しました。
select contract_id,owner,address,approver
from
(
select contract_id
from Table1
where owner like '%X%'
and address like '%Mad%'
) t1
inner join
(
select contract_id
from Table2
where approver = 'YZX'
) t2 using (contract_id) group by approver;
結果は次のようになりました。
> +-------------+---------------+-----------+-------------+
> |contract_id | owner | address | approver |
> +-------------+---------------+-----------+-------------+
> |11111 | XYZ | Madurai | YZX |
> +-------------+---------------+-----------+-------------+
2番目は現在行方不明です。私もそれが欲しい。
編集 2: サンプル データと正確なクエリを追加しました。
EDIT 3:結果を以下のようにフォーマットしたいのですが、
> +-------------+---------------+-----------+-------------+
> |contract_id | owner | address | approver |
> +-------------+---------------+-----------+-------------+
> |11111 | XXX | Madurai | YZX |
> +-------------+---------------+-----------+-------------+
> |11111 | XYZ | Madras | NULL |
> +-------------+---------------+-----------+-------------+
編集 4: 私が望んでいたものを達成しました。以下は私が使用したクエリです。
create temporary table table1 select *
from
(
select *
from Table1
where owner like '%X%'
and address like '%Mad%'
) t1
inner join
(
select *
from Table2
where approver = 'YZX'
) t2 using (contract_id) limit 1;
そしてクエリ、
insert into table1 select contract_id, IF((select count(*) from table1 where owner = t.owner and contract_id = t.contract_id) > 0, NULL, t.contract_id),IF((select count(*) from table1 where address = t.adress and contract_id = t.contract_id) > 0, NULL, t.contract_id),IF((select count(*) from table1 where approver = t.approver and contract_id = t.contract_id) > 0, NULL, t.contract_id)
from
((
select *
from Table1
where owner like '%X%'
and address like '%Mad%'
) t1
inner join
(
select *
from Table2
where approver = 'YZX'
) t2 using (contract_id)) t;