【问题标题】:Select values if doesn't match in other table by left join如果通过左连接在其他表中不匹配,则选择值
【发布时间】:2017-06-27 10:54:50
【问题描述】:

我在从数据库的两个表中获取值时遇到了一些问题。 我的数据库中有两张表,一张是内存,第二张是付款 mem 存储用户的名字和drawid 支付表存储用户的抽奖和分期付款

用户每月向我们付款。 因此,如果抽奖 id 为 1 的用户在 2 月向我们付款,则两个表中的值是 mem drawid=1 和 name = something 付款抽奖 = 1 分期付款 = 2

在mem中的drawid和在payment中的drawid一样

所以表格有多对多的关系。 现在我需要找到所有在第 4 个月之前连一期都没有付款的会员列表。

我正在使用这个查询

 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

【问题讨论】:

  • 你有错误..? .磨损结果? ...更新您的帖子添加适当的数据样本和预期结果
  • 我没有任何错误,这个查询运行良好,我只想让这个查询也给我按用户分期付款的列表。
  • 给我们一些样本数据和对应的结果。
  • 在您之前版本的这个问题中,您推断会员可以选择付款的月份,并且他可以提前、拖欠或按时付款 - 或这些状态的任何组合。还是这样吗?
  • 是的,用户也可以选择月份预付

标签: php mysql mysqli


【解决方案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

试试上面的查询。

希望这会对你有所帮助。

【讨论】:

  • 这给了我最好的结果,但问题也给了我空白行!!
  • 其实我有重复的结果:(
  • 请给我建议,你给了我答案,但这需要更新...... :(你能帮我吗
  • 还是同样的问题。我也得到空白结果!
【解决方案2】:

鉴于此

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)

【讨论】:

    猜你喜欢
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多