2017-06-27 18 views
2

私のデータベースの2つのテーブルから値を取得する際に問題があります。 私は私のデータベース1に2つのテーブルを持っていることはMEMで、第二は、ユーザーの支払い MEMの店舗名とdrawidです 支払テーブルには他のテーブルで左結合で一致しない場合の値を選択

ユーザーが毎月私たちを支払って描くと、ユーザの割賦。 ドローIDが1のユーザーが2つのテーブル内の値は MEM drawid = 1と名前です2月に私たちを支払う場合はそう= MEMで何か 支払い引き分け= 1、割賦= 2

drawidはで引き分けと同じですお支払いは

ですので、テーブルには多少の関係があります。 今私は4ヶ月前に1割を支払っていないすべてのメンバーのリストを見つける必要があります。

私はこのクエリ

SELECT drawid,contact,dnd,mem.name, count(*) as numPayments FROM mem 
LEFT JOIN payment ON (mem.drawid = payment.draw) GROUP BY 
drawid HAVING numPayments < 4 

それが唯一の問題問題なくすべての良い作業だし、私もそう、私はテーブルの支払いからすべての割賦を取得する必要があり、ユーザーが支払った分割払いを表示する必要があるとされて使用していますwhileループで表示します。

このクエリは完璧ですが、それは私に繰り返しの結果を与える!!!

SELECT drawid,contact,dnd,mem.name, count(*) as numPayments,NULL numPaidPayments ,NULL PAID_CONTACT,NULL NAME_PAID FROM mem 
LEFT JOIN payment ON (mem.drawid = payment.draw) GROUP BY 
drawid HAVING numPayments < 4 
UNION 
SELECT NULL drawid,NULL contact, NULL dnd, NULL name,NULL numPayments,COUNT(*) as numPaidPayments ,contact PAID_CONTACT,mem.name NAME_PAID FROM mem 
INNER JOIN payment ON (mem.drawid = payment.draw) GROUP BY 
drawid HAVING numPaidPayments >= 4 
+0

あなたはエラーがありますか? 。 worng result? ...あなたの投稿を更新して、適切なデータサンプルと予想される結果を追加してください。 – scaisEdge

+0

このクエリがうまくいけばエラーは表示されません。私はこのクエリもユーザに支払った分割払いのリストを提供します。 – Amani

+1

サンプルデータと対応した結果を教えてください。 – Blank

答えて

1
SELECT drawid,contact,dnd,mem.name, count(*) as numPayments,NULL numPaidPayments ,NULL PAID_CONTACT,NULL NAME_PAID FROM mem 
    LEFT JOIN payment ON (mem.drawid = payment.draw) GROUP BY 
    drawid HAVING numPayments < 4 
    UNION 
    SELECT NULL drawid,NULL contact, NULL dnd, NULL name,NULL numPayments,COUNT(*) as numPaidPayments ,contact PAID_CONTACT,mem.name NAME_PAID FROM mem 
    INNER JOIN payment ON (mem.drawid = payment.draw) GROUP BY 
    drawid HAVING numPaidPayments >= 4 

問い合わせの上お試しください。

希望すると、これが役立ちます。

+0

これは私に一番良い結果をもたらしていますが、問題は私にも空行を与えています! – Amani

+0

実際には、私は結果を繰り返した:( – Amani

+0

私に答えを与えたが、これは更新する必要があります... :(あなたの助けてくれるplz – Amani

0

は、与えられたこの

MariaDB [sandbox]> select * from member; 
+------+ 
| id | 
+------+ 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
+------+ 
4 rows in set (0.00 sec) 

MariaDB [sandbox]> select * from payment; 
+--------+------+ 
| mem_id | mth | 
+--------+------+ 
|  1 | 1 | 
|  1 | 2 | 
|  1 | 3 | 
|  1 | 4 | 
|  2 | 1 | 
|  2 | 3 | 
|  3 | 2 | 
|  3 | 4 | 
+--------+------+ 
8 rows in set (0.00 sec) 

この

select m.id, group_concat(p.mth order by p.mth) mthspaid, 
     sum(case when p.mem_id is not null then 1 else 0 end) NoofMthsPaid, 
     4 - sum(case when p.mem_id is not null then 1 else 0 end) NoofMthsMissed 
from member m 
left join payment p on p.mem_id = m.id 
group by m.id 

この

+------+----------+--------------+----------------+ 
| id | mthspaid | NoofMthsPaid | NoofMthsMissed | 
+------+----------+--------------+----------------+ 
| 1 | 1,2,3,4 |   4 |    0 | 
| 2 | 1,3  |   2 |    2 | 
| 3 | 2,4  |   2 |    2 | 
| 4 | NULL  |   0 |    4 | 
+------+----------+--------------+----------------+ 
4 rows in set (0.00 sec) 

を与え、あなたはコードに追加する場合

select paid.*, due.mthsmissed 
from 
(
select m.id, group_concat(p.mth order by p.mth) mthspaid, 
     sum(case when p.mem_id is not null then 1 else 0 end) NoofMthsPaid, 
     4 - sum(case when p.mem_id is not null then 1 else 0 end) NoofMthsMissed 
from member m 
left join payment p on p.mem_id = m.id 
group by m.id 
) paid 
left join 
( 
select due.id, group_concat(due.mth order by due.mth) MthsMIssed 
from 
(  
select m.id,d.mth 
from member m,(select 1 mth union select 2 union select 3 union select 4) d 
) due 
left join payment p on p.mem_id = due.id and p.mth = due.mth 
where p.mth is null 
group by due.id 
) due on paid.id = due.id 
によるヶ月動作するように

あなたはこれを取得します

+------+----------+--------------+----------------+------------+ 
| id | mthspaid | NoofMthsPaid | NoofMthsMissed | mthsmissed | 
+------+----------+--------------+----------------+------------+ 
| 1 | 1,2,3,4 |   4 |    0 | NULL  | 
| 2 | 1,3  |   2 |    2 | 2,4  | 
| 3 | 2,4  |   2 |    2 | 1,3  | 
| 4 | NULL  |   0 |    4 | 1,2,3,4 | 
+------+----------+--------------+----------------+------------+ 
4 rows in set (0.04 sec) 
関連する問題